6

私は自分自身を何度も繰り返していることに気づきました、そしてそれはもちろん良くありません。それで、私はそれについて何かできるかどうか疑問に思いました。これは私のWPFアプリケーションの一般的なコードです。

private string _name;
public string Name
{
    get { return _name; }
    set
    {
        if (_name != value)
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
}

それで、私はそれをより良くそしてより読みやすくするためにどうにかしてセッターを包むことができるかどうか疑問に思いました。1つのアイデアは次のようなものでした:

protected void PropertySetter<T>(T property, T value, string name)
{
    if (EqualityComparer<T>.Default.Equals(property, value))
    {
        property = value;
        OnPropertyChanged(name);
    }
}

このような使用法:

private string _name2;
public string Name2
{
    get { return _name2; }
    set
    {
        PropertySetter<string>(Name2, value, "Name2");
    }
}

しかし、これが本当に賢いのか、値型でもうまくいくのかわかりませんか?

私はこのようなことを最初に試したのではないので、誰かがこのようなことへの確実な方法を知っているなら、チャイムを鳴らしてください。私はpropertyChangedをリフレクションなしでタイプセーフにすることはできなかったと思いますが、そこにあるアイデアも役に立ちます。

4

2 に答える 2

2

多分これはあなたを助けることができます

public class ObservableObject : INotifyPropertyChanged
{
    #region Events
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion

    #region Protected Methods
    protected virtual void SetAndNotify<T>(ref T field, T value, Expression<Func<T>> property)
    {
        if (!object.ReferenceEquals(field, value))
        {
            field = value;
            this.OnPropertyChanged(property);
        }
    }

    protected virtual void OnPropertyChanged<T>(Expression<Func<T>> changedProperty)
    {
        if (PropertyChanged != null)
        {
            string name = ((MemberExpression)changedProperty.Body).Member.Name;
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion
}

使用法:

private String _myField;
    public String MyProperty
    {
        get
        { return _myField; }
        set
        { SetAndNotify(ref _myField, value, () => MyProperty); }
    }

編集:クラスはこのOservableObjectクラスから継承する必要があります

于 2012-06-18T16:01:30.603 に答える
2

はい-これは完全に許容できる通常のコードです。

これはかなり標準化されていることがわかった例です(コードサンプルではこのタイプの使用法がたくさん見られます)。

public event PropertyChangedEventHandler PropertyChanged;

private void SetProperty<T>(ref T field, T value, string name)
{
    if (!EqualityComparer<T>.Default.Equals(field, value))
    {
        field = value;
        var handler = PropertyChanged;
        if (handler != null)
        {
          handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

このコードをを実装するクラス内にラップしINotifyPropertyChanged、このクラスからデータオブジェクトを継承します。

あなたの例では、イベントを直接呼び出しています-決してこれを行わないでください。メソッドが開始してからイベントを呼び出すまで、イベント参照が失われる可能性があります。イベントを呼び出す前に、必ずイベントのローカルキャッシュを作成してください。

于 2012-06-18T16:03:04.087 に答える