c# – 如何具有使用OnPropertyChanged的UserControl的可绑定属性
我有一个简单的用户控件(WinForms)与一些公共属性.当我使用此控件时,我想要将DataSourceUpdateMode设置为OnPropertyChanged的数据绑定到这些属性.数据源是一个实现INotifyPropertyChanged的类.
我知道需要创建与属性绑定,我在这样做. 我假设我的用户控件将不得不实现一个界面,或者属性需要用某些属性来修饰,或者是这些属性.但是我的研究已经出现了. 这应该如何实现?目前我正在通过调用OnValidating()在我的用户控件,当一个属性改变,但似乎不正确. 如果我在UserControl中设置了CausesValidation为true,我可以得到验证,但这对我来说并不是很有用.我需要验证每个子属性的变化. 注意这是一个WinForms的情况. 编辑:显然我没有任何解释的才华,希望这将澄清我在做什么.这是一个简短的例子: // I have a user control public class MyControl : UserControl { // I'm binding to this property public string ControlProperty { get; set; } public void DoSomething() { // when the property value changes,the change should immediately be applied // to the bound datasource ControlProperty = "new value"; // This is how I make it work,but it seems wrong OnValidating(); } } // the class being bound to the usercontrol public class MyDataSource : INotifyPropertyChanged { private string sourceProperty; public string SourceProperty { get { return sourceProperty; } set { if (value != sourceProperty) { sourceProperty = value; NotifyPropertyChanged("SourceProperty"); } } } // boilerplate stuff public event PropertyChangedEventHandler PropertyChanged; protected void NotifyPropertyChanged(string info) { if (PropertyChanged != null) PropertyChanged(this,new PropertyChangedEventArgs(info)); } } public class MyForm : Form { private MyControl myControl; public MyForm() { // create the datasource var dataSource = new MyDataSource() { SourceProperty = "test" }; // bind a property of the datasource to a property of the usercontrol myControl.DataBindings.Add("ControlProperty",dataSource,"SourceProperty",false,DataSourceUpdateMode.OnPropertyChanged); // note the update mode } } (我已经尝试过使用BindingSource,但结果是一样的.) 现在我想要发生的是,当MyControl.ControlProperty的值改变时,更改将立即传播到数据源(MyDataSource实例).为了实现这一点,在更改属性后,在usercontrol中调用OnValidating().如果我不这样做,我必须等待验证被焦点更改触发,这相当于“OnValidation”更新模式,而不是所需的“OnPropertyUpdate”验证模式.在改变一个属性值之后,我不觉得调用OnValidating()是正确的事情,即使它是有效的. 我正确地假设调用OnValidating()不是正确的方法吗?如果是这样,那么如何通知ControlProperty更改的数据源? 解决方法
我想我已经弄清楚了.我不明白变更通知如何从控件发送到绑定的数据源.
是的,调用OnValidating()是错误的方式. 从我拼接在一起,控件可以通过两种方式通知数据源属性已更改. 一种方式是控制实现INotifyPropertyChanged.我从来没有从控制端这样做过,我只想到绑定的数据源端必须实现它. 当我在我的用户控件上实现了INotifyPropertyChanged,并在适当的时候引发了PropertyChanged事件,它起作用. 第二种方式是控制为每个属性提出一个特定的更改事件.事件必须遵循命名约定:< propertyname>已更改 例如我的例子就是这样 公共事件EventHandler ControlPropertyChanged 如果我的财产被称为Foo,那将是FooChanged. 我没有注意到MSDN documentation的相关部分,它说:
第二种方式是所有现有WinForms控件的工作原理,所以这是我现在所做的工作.我在我的数据源上使用INotifyPropertyChanged,但是在我的控件上提出了更改的事件.这似乎是传统的方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |