WPF中点击YearView按钮后NavigateMonthCommand未执行的问题排查
我来帮你搞定这个命令绑定失效的问题——核心原因是YearView的DataContext设置错误,导致按钮找不到对应的命令实例。
1. 错误根源:DataContext被设成了字符串
看你YearView.xaml里的这段代码:
<Grid Background="White" DataContext="viewmodels:YearViewModel">
这里你把DataContext赋值成了字符串"viewmodels:YearViewModel",而不是实际的YearViewModel对象实例。按钮的Command="{Binding NavigateMonthCommand}"是在找当前DataContext下的NavigateMonthCommand属性,可现在DataContext是个字符串,自然找不到命令,Execute方法也就永远不会被调用。
2. 正确的处理方式:移除手动设置的DataContext
因为你已经在MainWindow的ContentControl里通过DataTemplate把YearViewModel和YearView关联起来了:
<DataTemplate DataType="{x:Type viewmodels:YearViewModel}"> <views:YearView/> </DataTemplate>
当ContentControl渲染YearViewModel时,会自动把YearView的DataContext设置为对应的YearViewModel实例,完全不需要手动指定DataContext。
你只需要删掉Grid上的DataContext="viewmodels:YearViewModel"这行代码,修改后的YearView.xaml Grid部分应该是:
<Grid Background="White">
3. 可选:设计时数据上下文(方便预览)
如果想在Visual Studio设计器里看到绑定的预览效果,可以用设计时DataContext,不会影响运行时逻辑:
<Grid Background="White" d:DataContext="{d:DesignInstance Type=viewmodels:YearViewModel, IsDesignTimeCreatable=True}">
这里的d:前缀是设计时专用的,运行时会被忽略。
验证
修改后重新运行程序,点击Month按钮,NavigateMonthCommand.Execute()应该会被正常调用,MainWindow的ContentControl会自动切换显示MonthView。
内容的提问来源于stack exchange,提问作者oopsHithere

