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

前端之家收集整理的这篇文章主要介绍了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的相关部分,它说:

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

猜你在找的C#相关文章