1

最近、INotifyPropertyChange インターフェイスを発見しました。このインターフェイスをクラスに実装することができ、すべて正常に動作します。ただし、コードでこのイベントを傍受して関数を起動できるかどうか疑問に思っていました関数があるとしましょう

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が呼び出されたときに呼び出されるだけでしたか?

2番目の場合は、イベントハンドラーを登録するだけです。

編集

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 に答える