WPF XAML控件已实现INotifyPropertyChanged但绑定仍不更新问题求解
问题根源
你这个问题是两个ViewModel实例不统一导致的:
你在DefaultSongView.xaml里给Grid硬编码了一段DataContext:
<Grid.DataContext> <viewmodels:DayViewModel/> </Grid.DataContext>
这段代码会在DefaultSongView加载时创建一个全新的DayViewModel实例,和上层DayView绑定的DayViewModel完全是两个独立对象。你点击Edit按钮修改的是这个新实例的CurrentSongViewModel属性,上层DayView绑定的原实例根本没被修改,自然不会触发视图更新。你之前断点看到的setter触发,其实触发的是这个新实例的setter,和绑定的实例无关。
修复步骤
- 删除DefaultSongView里硬编码的DataContext
删掉DefaultSongView.xaml中<Grid.DataContext>的整段定义,不要手动创建ViewModel实例。 - 调整Command绑定,指向父级DayViewModel的命令
因为DefaultSongView是加载在ContentControl的DataTemplate里的,它的默认DataContext是DefaultSongViewModel,而EditSongCommand定义在父级的DayViewModel中,所以需要用RelativeSource向上找祖先控件的DataContext:
<Button Content="Edit" Command="{Binding DataContext.EditSongCommand, RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}}" Style="{StaticResource CollectionModifierButton}" DockPanel.Dock="Right"/>
修改完成后重新运行,点击Edit按钮就会修改DayView绑定的同一个DayViewModel实例的CurrentSongViewModel属性,ContentControl收到属性变更通知后就会自动切换对应的DataTemplate了。
内容的提问来源于stack exchange,提问作者oopsHithere
相关产品推荐
相关产品推荐

