2

INotifyPropertyChanged変数が変更されたときにイベントを発生させるためにカスタム クラス内で使用しましたが、double などの単一の変数の変更でイベントを発生させる簡単な方法があるかどうか疑問に思っていました。

たとえば、WPF アプリでは、

private double a;

で、いつでもイベントを発生させる簡単なMainWindow.xaml.cs方法はありますか?a

4

4 に答える 4

3

フィールドには、変更を追跡する手段がありません。それを機能させるには、プロパティである必要があり、何かが追跡を処理する必要があります。INotifyPropertyChangedそれがインターフェースの目的です。

この値への変更を追跡する通常の手段はINotifyPropertyChanged、クラスに実装することです。

于 2013-06-12T23:10:49.057 に答える
2

a私があなたを正しく理解していれば、a のセッターを作成する必要があります。これにより、クラスにカプセル化する代わりに、properychange イベント/カスタム イベントが発生します。

このようなもの:

private double a;

    public double A
    {
        get { return a; }
        set { a = value;
              firepropertyChange(a);
            }
    }
于 2013-06-12T23:13:30.600 に答える
0

C# 5.0 を使用している場合は、次のCallerMemberName方法で属性を使用できます。

class MyData : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            RaisePropertyChanged();
        }
    }

    private string _anotherProperty;
    public string AnotherProperty
    {
        get { return _anotherProperty; }
        set
        {
            _anotherProperty = value;
            RaisePropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged([CallerMemberName] string caller = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(caller));
        }
    }
}

ご覧のとおり、プロパティ名を何度も入力せずに、各プロパティRaisePropertyChanged();を呼び出すだけです。set

別のアプローチは、ModelBaseクラスを定義することです。

class ModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void Set<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
    {
        if (!Object.Equals(field, value))
        {
            field = value;

            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

そして、モデルを次から派生させますModelBase

class Conf : ModelBase
{
    NodeType _nodeType = NodeType.Type1;

    public NodeType NodeType
    {
        get { return _nodeType; }
        set { Set(ref _nodeType, value); }
    }
}
于 2013-06-12T23:42:02.047 に答える
0

はい(依存)、プロパティを介して変数アクセスをラップし、変更時にイベントを発生させ、その変数へのすべてのアクセスがプロパティを介して行われるようにする場合

private double a;

public double PropertyA
{
    get
    {
        return a;
    }
    set
    {
        // set value and fire event only when value is changed
        // if we want to know when value set is the same then remove if condition
        if (a != value)
        {
            a = value;
            PropertyChanged("PropertyA");
        }
    }
}

// when changing a, make sure to use the property instead...
PropertyA = 5.2;

...そうでなければ、いいえ

于 2013-06-12T23:14:36.347 に答える