【发布时间】:2011-09-29 03:52:49
【问题描述】:
我有一个带有一些公共属性的简单用户控件(WinForms)。当我使用这个控件时,我想将数据绑定到那些 DataSourceUpdateMode 设置为 OnPropertyChanged 的属性。数据源是一个实现 INotifyPropertyChanged 的类。
我知道需要针对属性创建绑定,我正在这样做。
我假设我的用户控件必须实现一个接口,或者属性需要用一些属性或类似的东西来装饰。但我的研究出现了空白。
这应该如何实现?目前,每当属性更改时,我通过在我的用户控件中调用 OnValidating() 来做到这一点,但这似乎不正确。
如果我在用户控件上将 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 实例)。为了实现这一点,我在更改属性后在用户控件中调用 OnValidating()。如果我不这样做,我必须等到焦点更改触发验证,这相当于“OnValidation”更新模式,而不是所需的“OnPropertyUpdate”验证模式。我只是不觉得在更改属性值后调用 OnValidating() 是正确的做法,即使它(有点)有效。
我是否认为调用 OnValidating() 是不是正确的方法?如果是这样,如何通知数据源 ControlProperty 更改?
【问题讨论】:
-
至少对我来说,这个问题还不清楚......你到底想完成什么?什么(不)起作用?
-
我觉得你的解释很清楚。就好像你在读我的心似的。我对接口/装饰器有相同的想法,然后考虑调用 OnValidating 方法并且不喜欢这个想法。我想这只是处理复杂主题的本质。我完全理解你想要做什么,因为我正在尝试做同样的事情!
标签: c# .net winforms data-binding user-controls