【发布时间】:2013-02-26 17:49:38
【问题描述】:
我需要在 WinForm 中引发对象事件。 更改对象属性时需要更改控件状态(在 UI 中)。如何在 UI 中引发对象事件?
编辑:在表单上,我有 2 个绑定到对象属性的下拉菜单。当第一个选择为假时,我需要禁用第二个下拉菜单。
【问题讨论】:
-
你必须更具体,或者你可以举一个例子来更好地展示你的问题。
我需要在 WinForm 中引发对象事件。 更改对象属性时需要更改控件状态(在 UI 中)。如何在 UI 中引发对象事件?
编辑:在表单上,我有 2 个绑定到对象属性的下拉菜单。当第一个选择为假时,我需要禁用第二个下拉菜单。
【问题讨论】:
如果您的对象已经实现了INotifyPropertyChanged,您可以在您的WinForm 类中执行以下操作:
yourObject.PropertyChanged += (s, e) =>
{
if (e.PropertyName == "Name") {
//Check the value of the property here, etc...
button1.Enabled = false;
}
};
在该示例中,Name 是您要监控的属性。
【讨论】:
你不能引发对象的事件。只有对象可以引发它的事件。您只能订阅对象的事件。为什么?因为 event 实际上是一对用于添加和删除处理程序的方法。它与委托类型的属性不同,您可以从任何地方调用。
因此,您应该做一些事情,这会导致对象引发该事件。没有办法直接引发事件。
这里是INotifyPropertyChanged 用法示例:
// your object
public class Foo : INotifyPropertyChanged
{
private bool _bar;
public bool Bar
{
get { return _bar; }
set {
if (_bar == value)
return;
_bar = value;
OnPropertyChanged("Bar");
}
}
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
并将您的控件绑定到此对象:
yourControl.DataBindings.Add("Enabled", foo, "Bar");
当Bar 属性发生变化时,foo 对象将引发事件,您的控件将处理该事件。
【讨论】:
INotifyPropertyChanged 接口。并让您的对象在属性更改时引发 PropertyChanged 事件。然后订阅该事件并禁用控制。
Enabled 属性的示例