当属性值改变时,将事件添加到WPF控制器

4
我有一个属性。
public sealed partial class Computer
{
    private bool _online;
    public bool Online
    {
        get { return _online; }
        set
        {
            _online = value;
            RaiseProperty("Online");
        }
    }
 }

这会引发一个类型为 INotifyPropertyChanged 的事件。

public sealed partial class Computer : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

    private void RaiseProperty(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
 }

我的问题是,如何在这种情况下向TabControl添加一个额外的事件,以便每次Online属性更改时运行特定的方法?

2个回答

4

您需要在PropertyChanged事件中注册一个方法。

MyComputer.PropertyChanged += Computer_PropertyChanged;

void Computer_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Online")
    {
        // Do Work
    }
}

1
天啊,那真是令人尴尬的简单 :O - Harald S. Hanssen
3
如果您想使用此解决方案,请查看 http://george.softumus.com/?p=32 - 这里有一个解决方案,可以防止在代码中使用“魔法字符串”(如“Online”)。 - chopikadze
@chopikadze 謝謝,我總有一天要仔細研究他的代碼。我從來沒有喜歡在 PropertyChanged 事件中使用「魔法字符串」。 - Rachel
修复了上面的链接:http://george.softumus.com/2011/10/inotifypropertychanged-and-magic.html - chopikadze

1
public sealed partial class Computer
{
    // This event is fired every time when Online is changed
    public event EventHandler OnlineChanged;

    private bool _online;
    public bool Online
    {
        get { return _online; }
        set
        {
            // Exit if online value isn't changed
            if (_online == value) return;

            _online = value;
            RaiseProperty("Online");

            // Raise additional event only if there are any subscribers
            if (OnlineChanged != null)
                OnlineChanged(this, null);
        }
    }
}

您可以像这样使用此事件:

Computer MyComputer = new MyComputer();
MyComputer.OnlineChanged += MyComputer_OnlineChanged;

void MyComputer_OnlineChanged(object sender, EventArgs e)
{
    Computer c = (Computer)c;
    MessageBox.Show("New value is " + c.Online.ToString());
}

Rachel的解决方案更准确,而且很容易实现。虽然你的想法也不错 :) 只可惜只有一个人能得到“被接受的答案”。 - Harald S. Hanssen
Rachel的解决方案更简单实用。我的解决方案只有在需要在许多地方监视相同属性时才更好。如果您只想在1-2-3个地方监视更改或者您需要监视某些属性,则Rachel的方案更好。 - chopikadze
它只在一个地方使用,但是还是需要考虑一下。 - Harald S. Hanssen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接