WPF DataGrid多值转换器绑定ItemSource外属性的实现问题
DataGrid列绑定外部ViewModel属性的解决方案
方法1:通过RelativeSource关联父级DataContext
因为DataGrid列的DataContext是集合中的单个对象,无法直接访问ViewModel的BeforeTax属性,可通过RelativeSource找到拥有ViewModel的父级元素(比如DataGrid本身)来绑定:
<Checkbox IsChecked="{Binding BeforeTax}"/> <DataGrid ItemsSource="{Binding ArticleCollection}"> <DataGridTextColumn Header="Price"> <DataGridTextColumn.Binding> <MultiBinding Converter="{StaticResource BeforeAfterTaxMultiConverter}"> <Binding Path="Price"/> <Binding Path="DataContext.BeforeTax" RelativeSource="{RelativeSource AncestorType={x:Type DataGrid}}"/> </MultiBinding> </DataGridTextColumn.Binding> </DataGridTextColumn> </DataGrid>
方法2:通过ElementName绑定到Checkbox控件
给Checkbox设置名称后,直接绑定它的IsChecked属性,这样无需依赖DataContext层级:
<Checkbox x:Name="cbBeforeTax" IsChecked="{Binding BeforeTax}"/> <DataGrid ItemsSource="{Binding ArticleCollection}"> <DataGridTextColumn Header="Price"> <DataGridTextColumn.Binding> <MultiBinding Converter="{StaticResource BeforeAfterTaxMultiConverter}"> <Binding Path="Price"/> <Binding ElementName="cbBeforeTax" Path="IsChecked"/> </MultiBinding> </DataGridTextColumn.Binding> </DataGridTextColumn> </DataGrid>
额外提示
- 确认
BeforeAfterTaxMultiConverter的逻辑正确:接收两个参数,第一个是商品价格(数值类型),第二个是布尔值,根据该布尔值返回税前或税后价格。 - 使用RelativeSource时,如果DataGrid嵌套在多层容器中,可调整
AncestorLevel参数指定层级,确保找到正确的DataContext载体。
内容的提问来源于stack exchange,提问作者ChMar
相关产品推荐
相关产品推荐

