【问题标题】:Bound UserControl is not updating data sourceBound UserControl 未更新数据源
【发布时间】:2012-02-08 05:54:41
【问题描述】:

我有一个用户控件,上面有一个文本框、按钮和一个工具提示控件。它确实实现了 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));

}

【问题讨论】:

  • 真的是 Windows 窗体吗?你说的是INotifiedPropertyChanged...
  • 并将代码放在您实际绑定到数据的位置...
  • 您使用中间属性是否有特殊原因?您可以直接将 url 文本框的 Text 属性绑定到绑定源的 First 属性。

标签: c# winforms data-binding


【解决方案1】:

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());
}

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

这里是 MSDN 上的主题:How to: Apply the PropertyNameChanged Pattern

【讨论】:

    【解决方案2】:

    这应该适用于从数据源读取值。

    但是,在将值写入数据源时,您似乎是直接从url 文本框存储和获取Url 值。但是,当文本框的文本在 UI 中发生更改时,您不会发出属性更改通知。为了解决这个问题,在文本框上添加一个 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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多