1

我最近刚刚发现了一个 INotifyPropertyChange 接口。我设法在我的 clss 中实现了这个接口,一切正常。但是我想知道是否可以在代码中拦截这个事件并触发一个函数假设我有一个函数

DoStuff()

我不想在每次 property1、property2 或 property3 更改时触发此功能。当然我可以把这个函数放在我班级的 set 块中,但这不是一个好主意(我认为)。

4

5 回答 5

2

如果您的意思是处理此事件的内部方法,您可以通过在类构造函数中注册事件来完成。例如:

public class AnswerViewModel : IAnswerViewModel
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string content;

    public AnswerViewModel()
    {
        PropertyChanged += (sender, args) => DoStuff();
    }

    public string Content
    {
        get { return content; }
        set
        {
            content = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Content"));
        }
    }

    public void DoStuff()
    {
        // this method will be called whenever PropertyChanged event raised
    }
}

如果拦截方法属于其他类:

public class PropertiesInterceptor
{
    private readonly AnswerViewModel viewModel;

    private readonly List<string> propertiesToIntercept =
        new List<string> { "property1", "property2", "property3" };

    public PropertiesInterceptor(AnswerViewModel viewModel)
    {
        this.viewModel = viewModel;
        viewModel.PropertyChanged += OnPropertyChanged;
    }

    private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
    {
        if (propertiesToIntercept.Contains(args.PropertyName))
        {
            DoStuff();
        }
    }

    private void DoStuff()
    {
        // Do something with viewModel
    }
}
于 2010-09-09T16:45:35.440 回答
0

您是否需要它来替换现有的 NotifyPropertyChanged 事件处理程序,或者只是在调用 NotifyPropertyChanged 时被调用?

如果你的意思是第二个,你可以简单地注册一个事件处理程序

编辑

您可以添加在 NotifyPropertyChanged 上调用的事件处理程序,检查属性参数是否等于 Property1、Property2 或 Property3,然后才将其转发到您要调用的实际函数。

于 2010-09-09T16:46:11.070 回答
0

拦截 PropertyChanged 事件:

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged.aspx

于 2010-09-09T16:46:12.540 回答
0

您可以从 RaisePropertyChanged() 方法触发该方法:

public int Property1
{
    get { return this.property1; }
    set
    {
        if (this.property1 != value)
        {
            this.property1 = value;
            RaisePropertyChanged("Property1");
        }
    }
}

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

     DoStuff(); // Call DoStuff here.
}
于 2010-09-09T16:48:03.363 回答
0

窃取以利沙的答案来回答你在梅林的回答中的问题

public class AnswerViewModel : IAnswerViewModel
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string property1;
    private string property2;
    private string propertyX;

    public AnswerViewModel()
    {
        PropertyChanged += (sender, args) => 
        {
            if(args.PropertyName == "Property1" || args.PropertyName == "Property2")
                DoStuff();
        }
    }

    public string Property1
    {
        get { return content; }
        set
        {
            property1 = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Property1"));
        }
    }
    public string Property2
    {
        get { return content; }
        set
        {
            property2 = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Property2"));
        }
    }
    public string PropertyX
    {
        get { return content; }
        set
        {
            propertyX = value;
            PropertyChanged(this, new PropertyChangedEventArgs("PropertyX"));
        }
    }

    public void DoStuff()
    {
        // this method will be called whenever PropertyChanged event raised from Property1 or Property2
    }
}

如果 DoStuff 所在的班级是您可以做的成员

    private otherClass
    public AnswerViewModel()
    {
        PropertyChanged += (sender, args) => 
        {
            if(args.PropertyName == "Property1" || args.PropertyName == "Property2")
                otherClass.DoStuff();
        }
    }

否则,您可以让 otherClass 在您的主代码中自行注册一个事件。

于 2010-09-09T17:01:55.977 回答