【问题标题】:Call object event from WinForm从 WinForm 调用对象事件
【发布时间】:2013-02-26 17:49:38
【问题描述】:

我需要在 WinForm 中引发对象事件。 更改对象属性时需要更改控件状态(在 UI 中)。如何在 UI 中引发对象事件?

编辑:在表单上,​​我有 2 个绑定到对象属性的下拉菜单。当第一个选择为假时,我需要禁用第二个下拉菜单。

【问题讨论】:

标签: c# winforms events


【解决方案1】:

如果您的对象已经实现了INotifyPropertyChanged,您可以在您的WinForm 类中执行以下操作:

yourObject.PropertyChanged += (s, e) =>
    {
        if (e.PropertyName == "Name") {
            //Check the value of the property here, etc...
            button1.Enabled = false;
        }
    };

在该示例中,Name 是您要监控的属性。

【讨论】:

  • 像魅力一样工作!非常感谢!
【解决方案2】:

你不能引发对象的事件。只有对象可以引发它的事件。您只能订阅对象的事件。为什么?因为 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 对象将引发事件,您的控件将处理该事件。

【讨论】:

  • 其实我需要在对象属性设置为false时禁用控制。所以我应该使用控制改变事件来处理对象事件?
  • @user1997418 你能改变你的对象的源代码吗?如果是,那么您可以通过您的对象实现INotifyPropertyChanged 接口。并让您的对象在属性更改时引发 PropertyChanged 事件。然后订阅该事件并禁用控制。
  • 好吧,我正在使用 CSLA,它会自行引发 NotifyPropertyChanged。我需要做的就是当 objects 属性设置为 false 时禁用 Form 中的控件。
  • @user1997418 查看我最后一个将数据绑定到Enabled 属性的示例
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多