C# 绑定的UserControl未更新数据源

C# 绑定的UserControl未更新数据源,c#,winforms,data-binding,C#,Winforms,Data Binding,我有一个UserControl,上面有一个文本框、按钮和工具提示控件。它确实实现了INotifyPropertyChanged我尝试过重写Text属性并添加我自己的属性,但在所有情况下,控件都可以从绑定的数据源读取数据,但从不更新数据源。文本更改时引发我的事件。下面是一些代码。所有其他标准控件都工作正常。当用户输入或更改值时,我需要什么来获取控件以更新数据源 public partial class UrlControl : UserControl, INotifyPropertyChanged

我有一个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);
        }
    }
这是表单设计器中的绑定代码

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

}

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

例如:

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());
}
这就是你需要做的。数据绑定精灵将看到该事件,并在创建绑定时将其连接起来


以下是MSDN的主题:

这对于从数据源读取值应该很有效

但是,在向数据源写入值时,您似乎直接从
Url
文本框中存储和获取
Url
值。但是,当用户界面中文本框的文本发生更改时,不会引发属性更改通知。要解决此问题,请在textbox上添加TextChanged事件处理程序,该处理程序可以简单调用:

void url_TextChanged(object sender, EventArgs e)
{
    OnPropertyChanged("Url");
    OnUrlChanged(); // See additional note below
}
另一方面,虽然实现INotifyPropertyChanged应该可以工作。。。当涉及到Windows窗体绑定时,您还可以创建一个属性名后缀为“Changed”的事件,绑定应注意:

public event EventHandler UrlChanged;

protected virtual void OnUrlChanged()
{
    var handler = UrlChanged;
    if (handler != null)
    {
        handler(this, EventArgs.Empty);
    }
}

[Bindable(true)]
[Browsable(true)]
public string Url
{
    get
    {
        return url.Text;
    }
    set
    {
        if (value != url.Text)
        {
            url.Text = value;
            OnPropertyChanged("Url");
            OnUrlChanged();
        }
    }
}

真的是Windows窗体吗?你说的是
INotifiedPropertyChanged
…并且把代码放在你实际绑定到数据的地方…你使用中间属性有什么特别的原因吗?您可以将
url
textbox的Text属性直接绑定到绑定源的
First
属性上。