绑定的 UserControl 未更新数据源

jac*_*jac 3 c# data-binding winforms

我有一个 UserControl,上面有一个文本框、按钮和一个工具提示控件。它确实实现了INotifyPropertyChanged我已经尝试覆盖Text属性并添加我自己的属性,但在所有情况下,控件都可以很好地从绑定数据源读取,但从不更新数据源。更改文本时会引发我的事件。部分代码如下。所有其他标准控件工作正常。当用户输入或更改值时,我需要什么才能获得更新数据源的控件?

public partial class UrlControl : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [Bindable(true)]
    [Browsable(true)]
    public string Url
    {
        get
        {
            return url.Text;
        }
        set
        {
            if (value != url.Text)
            {
                url.Text = value;
                OnPropertyChanged("Url");
            }
        }
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是表单设计器的绑定代码。

this.urlControl1.DataBindings.Add(new System.Windows.Forms.Binding("Url", this.customerBindingSource, "First", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

}
Run Code Online (Sandbox Code Playgroud)

Igb*_*man 5

INotifyPropertyChanged用于数据源。它允许您的数据源将属性更改通知绑定控件和其他侦听器。但是,控件本身使用不同的机制。这有点奇怪:您使用命名约定在控件上创建事件<PropertyName>Changed。当属性的值发生变化时,您会引发相关事件。

例子:

public string Url
{
    get { return url.Text; }
    set 
    { 
        if (value != url.Text) 
        { 
            url.Text = value; 
            OnUrlChanged(); // raise event
        }
    }
}

public event EventHandler UrlChanged;

private void OnUrlChanged()
{
    // raise the UrlChanged event
    if (UrlChanged != null)
        UrlChanged(this, new EventArgs());
}
Run Code Online (Sandbox Code Playgroud)

这就是你需要做的。Databinding Fairies 将看到该事件并在您创建绑定时将其连接起来。

这是 MSDN 上的主题:如何:应用 PropertyNameChanged 模式