绑定的UserControl未更新数据源
本文关键字:更新 数据源 UserControl 绑定 | 更新日期: 2023-09-27 18:19:58
我有一个UserControl,上面有一个Textbox、Button和Tooltip控件。它确实实现了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
用于数据源。它允许数据源将属性更改通知绑定控件和其他侦听器。然而,控件本身使用不同的机制。这有点奇怪:您使用命名约定<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());
}
这就是你所需要做的。Databinding Fairies将看到该事件,并在你创建绑定时将其连接起来。
以下是MSDN上的主题:如何:应用PropertyNameChanged模式
这应该可以很好地从数据源读取值。
但是,当要将值写入数据源时,看起来就像是直接从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();
}
}
}