You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF XAML控件已实现INotifyPropertyChanged但绑定仍不更新问题求解

问题根源

你这个问题是两个ViewModel实例不统一导致的:
你在DefaultSongView.xaml里给Grid硬编码了一段DataContext:

<Grid.DataContext>
    <viewmodels:DayViewModel/>
</Grid.DataContext>

这段代码会在DefaultSongView加载时创建一个全新的DayViewModel实例,和上层DayView绑定的DayViewModel完全是两个独立对象。你点击Edit按钮修改的是这个新实例的CurrentSongViewModel属性,上层DayView绑定的原实例根本没被修改,自然不会触发视图更新。你之前断点看到的setter触发,其实触发的是这个新实例的setter,和绑定的实例无关。

修复步骤

  1. 删除DefaultSongView里硬编码的DataContext
    删掉DefaultSongView.xaml中<Grid.DataContext>的整段定义,不要手动创建ViewModel实例。
  2. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:48:03