.net 只读属性上的WPF DataGrid双向绑定
我做了很多搜索,找到了很多关于这个问题的帖子,但仍然没有简单的解决方案。我有一个WPF数据网格绑定到一个实现ObservableCollection的自定义对象.net 只读属性上的WPF DataGrid双向绑定,.net,wpf,c#-4.0,datagrid,2-way-object-databinding,.net,Wpf,C# 4.0,Datagrid,2 Way Object Databinding,我做了很多搜索,找到了很多关于这个问题的帖子,但仍然没有简单的解决方案。我有一个WPF数据网格绑定到一个实现ObservableCollection的自定义对象。这通常适用于双向绑定的可编辑属性;但是有些属性(如下面的V)应该是只读的,特别是在UI中,并且从其他属性派生它们的值。但是,我们知道,只读属性不能启用双向绑定。如果我向V添加一个setter,并从绑定中删除ReadOnly属性,它将按预期工作,当然用户可以编辑不需要的值。我无法找出原因,因为您可以在WinForms中绑定回只读数据集列。
public class Example
{
private double t = 0;
private double v = 0;
public double T
{
get { return t; }
set { t = value; }
}
public double V
{
get { return t + 1; }
}
}
列标题代码:
new DataGridTextColumn()
{
Header = "V",
IsReadOnly = true,
Binding = new Binding (nameof(Example.V))
{
Mode = BindingMode.TwoWay //Needed to reflect changes back to DataGrid
NotifySourceUpdated = true //Doesn't seem to make a difference
}
};
您将使用
BindingMode.OneWay
。另外,您最好遵循MVVM,不要像那样使用代码隐藏。您的数据网格不应使用C#构建。要将通知放入UI,您可以使用INotifyPropertyChanged
,通常在ViewModel中使用,但有时在模型中可以接受。@NETscape:我尝试使用BindingMode.one,但对T(可编辑属性/列)所做的任何更改都不会在V(只读列)上的UI中更新或反映出来。我猜这就是INotifyPropertyChanged发挥作用的地方,但我不确定在这种情况下如何使用它,以便每当T发生变化时,V中的变化都会反映在UI中(您有示例吗?)。就MVVM范式而言,我将研究如何做到这一点。我在C#中使用它的原因是,此DataGrid的列根据某些条件(它将绑定到SQL和/或XML)是动态的,它们没有反映在UI中,因为您没有告诉UI属性已更改。例如,约翰和比尔是朋友,他们都可以互相交谈(双向)。比尔想知道约翰什么时候长大一岁,这样他就可以在报纸上发表这篇文章,但他永远也不会知道约翰的生日。只有当约翰告诉他时,他才能知道自己大一岁。比尔不能告诉约翰他什么时候大一岁,所以这应该是单向沟通。现在我们所要担心的就是约翰通知比尔。你必须通知用户界面。我建议阅读。如果你愿意学习的话,我们非常欢迎你在这里闲逛并提出问题;)@网景我不知道这样的聊天存在,我一定会用它!我非常愿意学习,因为我正在使用这个项目将我们公司的内部应用程序从WinForms转移到WPF。我利用INotifyPropertyChanged实现了一个处理程序,在设置T时触发V changing。我曾经当过导游。我想我很惊讶没有一个更干净的方法来做这么简单的事情。谢谢你给我指明了正确的方向!您将使用BindingMode.OneWay
。另外,您最好遵循MVVM,不要像那样使用代码隐藏。您的数据网格不应使用C#构建。要将通知放入UI,您可以使用INotifyPropertyChanged
,通常在ViewModel中使用,但有时在模型中可以接受。@NETscape:我尝试使用BindingMode.one,但对T(可编辑属性/列)所做的任何更改都不会在V(只读列)上的UI中更新或反映出来。我猜这就是INotifyPropertyChanged发挥作用的地方,但我不确定在这种情况下如何使用它,以便每当T发生变化时,V中的变化都会反映在UI中(您有示例吗?)。就MVVM范式而言,我将研究如何做到这一点。我在C#中使用它的原因是,此DataGrid的列根据某些条件(它将绑定到SQL和/或XML)是动态的,它们没有反映在UI中,因为您没有告诉UI属性已更改。例如,约翰和比尔是朋友,他们都可以互相交谈(双向)。比尔想知道约翰什么时候长大一岁,这样他就可以在报纸上发表这篇文章,但他永远也不会知道约翰的生日。只有当约翰告诉他时,他才能知道自己大一岁。比尔不能告诉约翰他什么时候大一岁,所以这应该是单向沟通。现在我们所要担心的就是约翰通知比尔。你必须通知用户界面。我建议阅读。如果你愿意学习的话,我们非常欢迎你在这里闲逛并提出问题;)@网景我不知道这样的聊天存在,我一定会用它!我非常愿意学习,因为我正在使用这个项目将我们公司的内部应用程序从WinForms转移到WPF。我利用INotifyPropertyChanged实现了一个处理程序,在设置T时触发V changing。我曾经当过导游。我想我很惊讶没有一个更干净的方法来做这么简单的事情。谢谢你给我指明了正确的方向!