【发布时间】:2016-09-09 03:22:03
【问题描述】:
我有一个带有 DataGridComboBoxColumn 列的 DataGrid,我需要启用或禁用另一列中的复选框单元格,但我的代码似乎不起作用。
我有以下代码定义我的组合列:
<DataGridComboBoxColumn Header="Location"
SelectedValueBinding="{Binding LocationId, Mode=TwoWay}"
SelectedValuePath="LocationId"
DisplayMemberPath="LocationText"
TextBinding="{Binding Location, Mode=TwoWay}">
这是我的复选框列的代码:
<DataGridCheckBoxColumn Header="Active"
Binding="{Binding IsActive}">
<DataGridCheckBoxColumn.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedLineItem.Location}"
Value="01">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridCheckBoxColumn.CellStyle>
</DataGridCheckBoxColumn>
我添加了一个 DataTrigger 来尝试检测 Location 字段何时更改为 01,并基于此尝试禁用所选行中的复选框单元格,但它不起作用。
我还需要根据其他值选中/取消选中组合。
知道如何实现这一目标吗?
更新 1:
好的,我已经取得了一些进展(靠侥幸!)现在我的触发器正在启动,但由于某种原因,每当我更改所选单元格下拉列表中的位置时,它都会更改所有行的值到相同的值。
这是我的下拉列的完整代码:
<DataGridComboBoxColumn Header="Location"
SelectedItemBinding="{Binding DataContext.SelectedLineItem.SelectedLocation,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
Mode=TwoWay}"
SelectedValuePath="LocationId"
DisplayMemberPath="LocationText"
TextBinding="{Binding Location, Mode=TwoWay}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding DataContext.Locations,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="FontSize" Value="14"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding DataContext.Locations,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}}"/>
<Setter Property="SelectedItem" Value="{Binding DataContext.SelectedLocation,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}}"/>
<Setter Property="IsReadOnly" Value="False"/>
<Setter Property="IsEditable" Value="True"/>
<Setter Property="FontSize" Value="14"/>
<EventSetter Event="KeyUp" Handler="LocationColumn_KeyUp"></EventSetter>
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsDropDownOpen" Value="true" />
</Trigger>
</Style.Triggers>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
这是我的复选框列的完整代码(不要担心触发器的作用 - 它们是测试触发器):
<DataGridCheckBoxColumn Header="Active" Binding="{Binding IsActive}">
<DataGridCheckBoxColumn.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedLocation.LocationId}" Value="1">
<Setter Property="Background" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding SelectedLocation.LocationText}" Value="" >
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding SelectedLocation.LocationText}" Value="01" >
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
<DataTrigger Binding="{Binding SelectedLocation.LocationText}" Value="02" >
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
<DataTrigger Binding="{Binding SelectedLocation.LocationText}" Value="03" >
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridCheckBoxColumn.CellStyle>
</DataGridCheckBoxColumn>
谁能弄清楚为什么当我更改组合中的值时我的所有行现在都被设置了?
谢谢。
【问题讨论】:
-
该绑定的数据上下文可能不是您认为的那样;它可以与
RelativeSource AncestorType=DataGrid一起使用吗? -
@EdPlunkett 我已经更新了我的答案。走得更远,但仍然不是 100%。有什么想法吗?