Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 只读属性上的WPF DataGrid双向绑定_.net_Wpf_C# 4.0_Datagrid_2 Way Object Databinding - Fatal编程技术网

.net 只读属性上的WPF DataGrid双向绑定

.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中绑定回只读数据集列。

我做了很多搜索,找到了很多关于这个问题的帖子,但仍然没有简单的解决方案。我有一个WPF数据网格绑定到一个实现ObservableCollection的自定义对象。这通常适用于双向绑定的可编辑属性;但是有些属性(如下面的V)应该是只读的,特别是在UI中,并且从其他属性派生它们的值。但是,我们知道,只读属性不能启用双向绑定。如果我向V添加一个setter,并从绑定中删除ReadOnly属性,它将按预期工作,当然用户可以编辑不需要的值。我无法找出原因,因为您可以在WinForms中绑定回只读数据集列。我觉得我缺少了一些简单的东西,可以让它在不重写一堆类的情况下工作。如果我不能做到这一点,我可能可以在DataGrid UI上手动刷新绑定对象(如果可以的话)。我正在使用.NET4.6。谢谢你的帮助

类别代码:

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。我曾经当过导游。我想我很惊讶没有一个更干净的方法来做这么简单的事情。谢谢你给我指明了正确的方向!