C# · 12月 30, 2021

c# – 如何具有使用OnPropertyChanged的UserControl的可绑定属性

我有一个简单的用户控件(WinForms)与一些公共属性.当我使用此控件时,我想要将DataSourceUpdateMode设置为OnPropertyChanged的数据绑定到这些属性.数据源是一个实现INotifyPropertyChanged的类.

我知道需要创建与属性绑定,我在这样做.

我假设我的用户控件将不得不实现一个界面,或者属性需要用某些属性来修饰,或者是这些属性.但是我的研究已经出现了.

这应该如何实现?目前我正在通过调用OnValidating()在我的用户控件,当一个属性改变,但似乎不正确.

如果我在UserControl中设置了CausesValidation为true,我可以得到验证,但这对我来说并不是很有用.我需要验证每个子属性的变化.

注意这是一个WinForms的情况.

编辑:显然我没有任何解释的才华,希望这将澄清我在做什么.这是一个简短的例子:

// I have a user controlpublic 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 usercontrolpublic 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的相关部分,它说:

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,但是在我的控件上提出了更改的事件.这似乎是传统的方式.