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