2011-10-17 10 views
0

(.Net 3.5を使用)外部データソースから設定をインポートするルーチンがあります。その後、どのプロパティが更新されたかを詳細にユーザーに表示する必要があります。通常、私はproperty_changedイベントを通じてプロパティの更新を追跡します。しかし、データソースからの値がすでにプロパティ値と等しい場合、プロパティセットが呼び出されたとしても、property_changedイベントは決して発生しません。しかし、私はまだそのようなプロパティを、データソースから "更新"されたものとしてユーザに表示する必要があります。"試みた"プロパティ変更のイベント

ここでよくあるパターンは何ですか?私のプロパティセッター - "property_attemptedset"に別のイベント(property_changedの追加)が必要ですか?

編集:したがって、私は単にプロパティセッターで同等性チェックをしないので、何かに関係なく「property_changed」が起動されるということです。しかし、私はいつも実際の価値の変化をフィルタリングするように言われてきました。それはベストプラクティスではないですか?

+0

あなたの編集のために私の答えを拡張しました。 – RoelF

答えて

1

あなたはこのようなあなたの特性を記述する場合:

public string LastName{ 
    get { return lastName; } 
    set { 
     lastName = value; 
     RaisePropertyChanged("LastName"); 
    } 
} 

それは常に値が同じであっても、PropertyChanged -eventを発射する必要があります。このために追加のイベントを発生させる必要はありません。あなたの編集に加えて

EDIT:はい、実際の値の変化を確認するためのベストプラクティスと考えられているが、あなたのシナリオは、非値の変化を追跡する必要がある場合なぜ、私が表示されませんそれを変更することはできません。 「ベストプラクティス」は、「このルールを破り、刑務所に行く」という意味ではありませんか?
しかし、これらのクラスは、共通のPropertyChanged動作に依存している他のオブザーバーを、持っている場合にはあなたが言及したように、あなたは常にプロパティを拡張し、別の(カスタム)イベントを投げることができます。

public event PropertyChangedEventHandler AttemptedPropertyChanged; 
    public void RaiseAttemptedPropertyChanged(string propName) 
    { 
     if (AttemptedPropertyChanged != null) 
     { 
      AttemptedPropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 


    public string LastName{ 
     get { return lastName; } 
     set {     
      RaiseAttemptedPropertyChanged("LastName"); 
      if (lastName == value) return; 
      lastName = value; 
      RaisePropertyChanged("LastName"); 
     } 
    } 
2

まあ、それはかなり一般的です実際にプロパティの値を変更していないときにPropertyChangedイベントを発生させないようにする必要があります。現在の値と新しい値をチェックするセッターのロジックを削除するだけです。

+0

ええ、私は本当に変更されない限り、PropertyChangedイベントを発生させないよう常に言われてきました。実際にコードに何の違いもないと確信していますか?そしてそれが何の違いもなければ、どうしてそんなことをするのですか? – Tekito

+0

プロパティが変更されているかどうかにかかわらず、すべての変更処理コードが実行されることになります(また、UIを更新する必要があります)。あなたがそのパフォーマンスを受け入れることを喜んでいるなら、次に進んでください。 – canon

1

あなたが書いたことに基づいて次のステップのように聞こえるのは、時には変更を防止することです。もしそうなら、BeforePropertySetのような新しいイベントを導入し、取り消しを可能にするイベントオブジェクトを渡します。

これはベストプラクティスを維持しています。いつか誰かがいつものようにpropertychangedを使用してコードが機能しない理由を理解することができず、あなたがしていることを明確にし、別々の懸念が少し良い。

関連する問題