WPF MVVM模式下ItemsControl的DataTemplate同时绑定集合属性与ICommand问题求助
绑定失败原因
ItemsControl的ItemTemplate(即你定义的DataTemplate)默认绑定上下文是ItemsSource集合中的单个元素,也就是OderModel对象。你直接写Command="{Binding LookBill}"时,WPF会在当前OderModel实例中查找LookBill属性,但该命令实际定义在父级的HomeViewModel中,自然找不到对应属性,绑定就会失效。
解决方案
你可以通过指定绑定源的方式访问父级HomeViewModel的命令,同时集合项自身属性的绑定不需要修改,依然会默认从OderModel中查找,有两种常用实现方式:
方式1:通过ElementName绑定
你已经给ItemsControl设置了x:Name="OderViewModel",直接通过名称获取父级控件的DataContext即可,修改按钮的Command绑定代码:
<Button x:Name="btn_HomeBill" Background="{DynamicResource FooterHome}" BorderBrush="{x:Null}" Command="{Binding ElementName=OderViewModel, Path=DataContext.LookBill}" CommandParameter="{Binding}"> <!-- 若需要把当前点击的OderModel作为参数传给命令可保留这行,不需要可删除 --> <Image Source="{StaticResource lookbill}" VerticalAlignment="Center" HorizontalAlignment="Center"/> </Button>
方式2:通过RelativeSource绑定
不依赖控件的Name属性,直接向上查找类型为ItemsControl的祖先控件获取DataContext:
<Button x:Name="btn_HomeBill" Background="{DynamicResource FooterHome}" BorderBrush="{x:Null}" Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Path=DataContext.LookBill}" CommandParameter="{Binding}"> <Image Source="{StaticResource lookbill}" VerticalAlignment="Center" HorizontalAlignment="Center"/> </Button>
补充说明:如果你需要拿到当前点击的订单信息,保留
CommandParameter的同时,需要把HomeViewModel里LookBill命令的RelayCommand泛型参数从Window修改为OderModel,执行方法中拿到的参数就是当前对应的OderModel实例。
内容的提问来源于stack exchange,提问作者Harry Phan
相关产品推荐
相关产品推荐

