我知道需要创建与属性绑定,我在这样做.
我假设我的用户控件将不得不实现一个界面,或者属性需要用某些属性来修饰,或者是这些属性.但是我的研究已经出现了.
这应该如何实现?目前我正在通过调用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更改的数据源?
解决方法
一种方式是控制实现INotifyPropertyChanged.我从来没有从控制端这样做过,我只想到绑定的数据源端必须实现它.
当我在我的用户控件上实现了INotifyPropertyChanged,并在适当的时候引发了PropertyChanged事件,它起作用.
第二种方式是控制为每个属性提出一个特定的更改事件.事件必须遵循命名约定:< propertyname>已更改
例如我的例子就是这样
公共事件EventHandler ControlPropertyChanged
如果我的财产被称为Foo,那将是FooChanged.
我没有注意到MSDN documentation的相关部分,它说:
For change notification to occur in a
binding between a bound client and a
data source,your bound type should
either:Implement the INotifyPropertyChanged
interface (preferred).Provide a change event for each
property of the bound type.
第二种方式是所有现有WinForms控件的工作原理,所以这是我现在所做的工作.我在我的数据源上使用INotifyPropertyChanged,但是在我的控件上提出了更改的事件.这似乎是传统的方式.