WPF MVVM问题:ItemsSource下Button的Command绑定找不到ViewModel命令
问题原因
TabControl的ItemTemplate里的元素,默认DataContext是ItemsSource集合中的单个项(也就是你的TabControlItemModel),所以你直接绑定ViewModel.CounterIncrementCommand时,程序会去TabControlItemModel里找ViewModel属性,自然找不到,就出现了绑定失败的错误。
解决方法
下面是几种可行的绑定方式,都能让Button找到ViewModel里的命令:
方法1:用RelativeSource向上查找TabControl
通过RelativeSource定位到父级的TabControl,然后访问它的DataContext(也就是包含ViewModel的上下文):
<Button Command="{Binding DataContext.ViewModel.CounterIncrementCommand, RelativeSource={RelativeSource AncestorType={x:Type TabControl}}, Mode=OneWay}"/>
方法2:用ElementName绑定
给TabControl设置一个名字,然后通过ElementName直接引用它的DataContext:
先给TabControl加名字:
<TabControl x:Name="MainTabControl" ItemsSource="{Binding ViewModel.TabItems, UpdateSourceTrigger=PropertyChanged}">
然后修改Button的绑定:
<Button Command="{Binding DataContext.ViewModel.CounterIncrementCommand, ElementName=MainTabControl, Mode=OneWay}"/>
方法3:简化绑定(如果ViewModel是直接的DataContext)
如果你的页面/窗口的DataContext就是ViewModel本身(而不是包含ViewModel属性的对象),那TabControl的ItemsSource应该是{Binding TabItems},此时Button的绑定可以简化为:
<Button Command="{Binding DataContext.CounterIncrementCommand, RelativeSource={RelativeSource AncestorType={x:Type TabControl}}, Mode=OneWay}"/>
内容的提问来源于stack exchange,提问作者SideSky
相关产品推荐
相关产品推荐

