0

C#では、次のようにプロパティを作成できます。

public string SomeRandomText
{
    get; set;
}

フレームワークは、このプロパティのバッキング変数の作成を処理します。どうすればそのようなプロパティを取得し、変更通知を受け取ることができますか?

これは、INotifyPropertyChangedを実装するクラスで許可されていますか?

public string SomeRandomTextBeingNotified
{
    get;
    set
    {
        NotifyPropertyChanged("SomeRandomTextBeingNotified");
    }
}
4

5 に答える 5

3

これを使用しようとすると、自動プロパティを使用できません。バッキングストアを作成する必要があります。

private string _someRandomText;
public string SomeRandomText {
    get { return _someRandomText; }
    set 
    {
        _someRandomText = value;
        NotifyPropertyChanged("SomeRandomText");
    }
}
于 2012-11-27T06:37:21.377 に答える
1

半自動プロパティのようなものはありません。それでも、面倒な命令型コードを必要としないINotifyPropertyChangedを実装する方法はかなりあります。

1)前に言及:アスペクト指向の商用プロジェクトであるPostSharp。

2)CastleDynamicProxyソリューションを作成します。サンプルはここにありますが、実際には他にもたくさんあります。

一般的なソリューションに時間を費やす価値はあります。ボイラープレートコードはしばらくすると厄介になり、エラーが発生しやすくなります。

于 2012-11-27T07:24:33.510 に答える
1

コードをすっきりと見せるために、INotifyPropertyChangedの属性を使用できます。

Property-Attributeを使用したINotifyPropertyChangedの簡単な使用法

この属性の使用をご覧ください...INotifyPropertyChanged

于 2012-11-27T06:42:43.867 に答える
1

実際には可能ですが、基本的にはバイトコードポストC#コンパイラを変更する必要があります。

これは大変な作業のように聞こえるかもしれませんが、これは、たとえばPostSharpに含まれているより簡単な後処理ステップの1つです。

http://www.sharpcrafters.com/solutions/notifypropertychanged

http://www.sharpcrafters.com/blog/post/Recording-Automate-INotifyPropertyChanged-with-Karol-Waledzik-from-Internetium.aspx

より多くの機能が利用可能です;)

それ以外の場合は注意してください

enter code hereここにコードを入力してください`NotifyPropertyChanged(" SomeRandomTextBeingNotified ");

悪いコードです。私はこれらすべてを1つのフィールド更新メソッドで実行します。

set 
{
    OnUpateField (ref _someRandomText, value);
}

updateメソッドはすべてを実行します-等しいかどうかを確認し(新しい値=古い値の場合はトリガーしないでください)、必要に応じて更新をトリガーします。コンパイラによって自動的に設定される呼び出しメソッドの3番目のパラメータを介してプロパティ名を取得します。別の方法として、LINQステートメントを使用しています(ref someRandomText、value、this-> SomeRandomText)。リファクタリングで名前が変更されない文字列は絶対に好きではありません;)

于 2012-11-27T06:43:13.490 に答える
1

基本クラスがない場合、このようなものは簡単で非常に柔軟です。

public class NotificationObject : INotifyPropertChanged
{
    private readonly Dictionary<string, object> Properties = new Dictionary<string, object>();

    public event PropertyChangedEventHandler PropertyChanged;

    protected TType Get<TType>(string propertyName)
    {
        object value;
        return Properties.TryGetValue(propertyName, out value) ? (TType)value : default(TType);
    }

    protected void Set<TType>(TType value, string propertyName, params string[] dependantPropertyNames)
    {
        Properties[propertyName] = value;
        OnPropertyChanged(propertyName);
        if (dependantPropertyNames != null)
        {
            foreach (string dependantPropertyName in dependantPropertyNames)
            {
                OnPropertyChanged(dependantPropertyName);
            }
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArts(propertyName));
        }
    }
}

これは次のように使用できます。

public SomeObjectThatNeedsToNotifySomething : NotificationObject
{
    public int SomeValue
    {
        get { return Get<int>("SomeValue"); }
        set { Set<int>(value, "SomeValue", "SomeAggregateValue"); }
    }

    public int SomeOtherValue
    {
        get { return Get<int>("SomeOtherValue"); }
        set { Set<int>(value, "SomeOtherValue", "SomeAggregateValue"); }
    }

    public int SomeAggregateValue
    {
        get { return SomeValue + SomeOtherValue; }
    }
}

すでに基本クラスがあり、INotifyPropertyChangedインターフェイスを実装する必要がある場合は、@ Robが正しく、バッキングフィールドを指定して、イベントを発生させます。

于 2012-11-27T06:49:33.467 に答える