私は WPF/XAML にかなり慣れていないので、回避方法がわからない問題に遭遇しました。
例を使用して私の問題を説明します。テニスコートを、プレーヤーの写真と名前とともに表示するアプリを開発する必要があります。と の 2 つのユーザー コントロールを作成TennisCourt
しましTennisPlayer
た。コントロールには、コントロールTennisCourt
の 4 つのインスタンスが含まれていますTennisPlayer
。
TennisPlayer
Player
には、プレイヤーの名前と写真を含むタイプ の DP があります。
TennisCourt
タイプの 4 つの DP がありPlayer
ます: Player1、Player2、Player3、Player4。
各TennisPlayer
インスタンスには、含まれている の Player1..4 依存関係プロパティの 1 つにバインドされた Player 依存関係プロパティがありCourtControl
ます。
私のViewModelにはPlayerタイプのオブジェクトがいくつかあり、もちろん実装してINotifyPropertyChanged
います。いずれかのプレーヤーが更新されるたびに、OnPropertyChanged
呼び出されます。
私の問題は次のとおりです。VMでプレーヤーオブジェクトを作成するOnPropertyChanged
と、呼び出され、全体を移動します: VM -> TennisCourt.PlayerX -> TennisPlayer.Player
. これは、初めて呼び出すときに正常に機能します。ただし、プレーヤーの写真は非同期で取得されており、その操作が終了した後、OnPropertyChanged
VM の for each player オブジェクトが再度呼び出されます。
TennisCourt
さて、いくつかのテストを行った後、行の最初のコントロール ( ) が通知を受け取り、PropertyChanged
VM からオブジェクトを再度取得することに気付きました。ただし、Player オブジェクトは実際には変更されていないため (参照は同じオブジェクトへの参照であり、変更されたのはオブジェクト内のフィールドにすぎません)、TennisCourt.PlayerX
プロパティは組み込みOnPropertyChanged
イベントを発生させていないように見えるため、バインディングTennisCourt.PlayerX -> TennisPlayer.Player
には何もありません。TennisPlayer.Player
フィールドは更新されません。VM で Player オブジェクトを実際に変更することにした場合、それは更新されますが、それは私がやりたいことではありません。
私は何か間違ったことをしていますか?このようなカスケードバインディングは良い習慣ではありませんか? 最初はTennisCourt
DP がなく、それぞれTennisPlayer.Player
が VM.Player に直接バインドされていました。の 2 番目のインスタンスを作成し、TennisCourt
別のプレイヤーを表示するまで、これは完全に機能しました。