禁用控件 WPF 的 DataGridTemplateColumn 样式
DataGridTemplateColumn Styling for Disabled Controls WPF
我的 WPF 应用程序中有一个 DataGrid
控件,并且我有一个复选框列作为列之一。我正在使用 DataGridTemplate
来构建数据网格。我的目标是更改禁用复选框的任何复选框数据网格单元格的背景颜色。我的复选框列如下所示:
<!-- style for the checkbox column cells -->
<Style x:Key="DefaultCheckboxCellStyle" TargetType="DataGridCell">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Background" Value="HotPink" />
</Trigger>
</Style.Triggers>
</Style>
...
<DataGridTemplateColumn Header="MyCheckBoxColumn" CellStyle="{StaticResource DefaultCheckboxCellStyle}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="chk" IsChecked="{Binding MyChkChecked, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Path=MyChkEnabled}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
我所做的一切似乎都没有改变禁用复选框的单元格背景。我正在显示禁用的复选框,但所有单元格本身仍处于启用状态。有没有办法将启用的值从内部复选框控件绑定到单元格?如果是这样,我可以在我的触发器中使用它。
非常感谢!
如您所见,禁用复选框不会禁用单元格。有几种方法可以解决这个问题。
一种方法是将 Style 触发器绑定到禁用复选框的同一个视图模型 属性。这属于 DefaultCheckboxCellStyle
,取代了您拥有的一个触发器。
<Style.Triggers>
<DataTriger Binding="{Binding MyChkEnabled}" Value="True">
<Setter Property="Background" Value="HotPink" />
</DataTriger>
</Style.Triggers>
或者您可以在 DefaultCheckboxCellStyle
中尝试此操作:保留您拥有的触发器,并禁用实际的单元格。然后您可以省略另一个 XAML 来禁用复选框本身,因为它无论如何都是单元格的子项。
<Setter Property="IsEnabled" Value="{Binding MyChkEnabled}" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Background" Value="HotPink" />
</Trigger>
</Style.Triggers>
顺便说一下,UpdateSourceTrigger=PropertyChanged
是一个空操作。
我的 WPF 应用程序中有一个 DataGrid
控件,并且我有一个复选框列作为列之一。我正在使用 DataGridTemplate
来构建数据网格。我的目标是更改禁用复选框的任何复选框数据网格单元格的背景颜色。我的复选框列如下所示:
<!-- style for the checkbox column cells -->
<Style x:Key="DefaultCheckboxCellStyle" TargetType="DataGridCell">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Background" Value="HotPink" />
</Trigger>
</Style.Triggers>
</Style>
...
<DataGridTemplateColumn Header="MyCheckBoxColumn" CellStyle="{StaticResource DefaultCheckboxCellStyle}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="chk" IsChecked="{Binding MyChkChecked, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Path=MyChkEnabled}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
我所做的一切似乎都没有改变禁用复选框的单元格背景。我正在显示禁用的复选框,但所有单元格本身仍处于启用状态。有没有办法将启用的值从内部复选框控件绑定到单元格?如果是这样,我可以在我的触发器中使用它。
非常感谢!
如您所见,禁用复选框不会禁用单元格。有几种方法可以解决这个问题。
一种方法是将 Style 触发器绑定到禁用复选框的同一个视图模型 属性。这属于 DefaultCheckboxCellStyle
,取代了您拥有的一个触发器。
<Style.Triggers>
<DataTriger Binding="{Binding MyChkEnabled}" Value="True">
<Setter Property="Background" Value="HotPink" />
</DataTriger>
</Style.Triggers>
或者您可以在 DefaultCheckboxCellStyle
中尝试此操作:保留您拥有的触发器,并禁用实际的单元格。然后您可以省略另一个 XAML 来禁用复选框本身,因为它无论如何都是单元格的子项。
<Setter Property="IsEnabled" Value="{Binding MyChkEnabled}" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="True">
<Setter Property="Background" Value="HotPink" />
</Trigger>
</Style.Triggers>
顺便说一下,UpdateSourceTrigger=PropertyChanged
是一个空操作。