我对 WPF/XAML 比较陌生,遇到了一个我不知道如何解决的问题。
我将用一个例子来描述我的问题。我需要开发一个应用程序,它将显示网球场以及这些球场上的球员照片和姓名。我创建了两个用户控件:TennisCourt
和TennisPlayer
. 该TennisCourt
控件包含 4 个TennisPlayer
控件实例。
TennisPlayer
有一个类型为 的 DP Player
,其中包含玩家的姓名和照片。
TennisCourt
有 4 个类型的 DP Player
:Player1、Player2、Player3、Player4。
每个TennisPlayer
实例都有其 Player 依赖属性绑定到包含的 Player1..4 依赖属性之一CourtControl
。
我的 ViewModel 有几个 Player 类型的对象,当然还实现了INotifyPropertyChanged
. 每当任何玩家更新时,OnPropertyChanged
都会被调用。
我现在的问题是:当我在我的虚拟机中创建播放器对象时,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。这工作得非常好,直到我创建了第二个实例TennisCourt
并希望它显示不同的玩家。