如何在XAML中更改未选中行的文本颜色

时间:2020-10-20 20:05:50

标签: wpf xaml checkbox datagrid

我想使用xaml将与应用程序中未选中的行关联的文本显示为灰色。我尝试了以下方法,但是它已被覆盖:

<DataGridTemplateColumn.CellTemplate>
   <DataTemplate>
      <CheckBox Name="cbkSelect" 
                IsChecked="{Binding Path=IsSelectedForOrder, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
         <CheckBox.Style>
            <Style TargetType="{x:Type CheckBox}">
               <Setter Property="Visibility" Value="Hidden"/>
               <Style.Triggers>
                  <Trigger Property="IsChecked" Value="False">
                     <Setter Property="Foreground" Value="Gray"/>
                  </Trigger>
                  <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Value="True">
                     <Setter Property="Visibility" Value="Visible"/>
                  </DataTrigger>
               </Style.Triggers>
            </Style>
         </CheckBox.Style>
      </CheckBox>
   </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

1 个答案:

答案 0 :(得分:0)

由于Foreground颜色应应用于给定行的所有单元格,因此您可以删除触发器。 CellTemplate内部的触发器仅适用于样式应用于的CheckBox

<DataGridTemplateColumn.CellTemplate>
   <DataTemplate>
      <CheckBox Name="cbkSelect" 
                IsChecked="{Binding Path=IsSelectedForOrder, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
         <CheckBox.Style>
            <Style TargetType="{x:Type CheckBox}">
               <Setter Property="Visibility" Value="Hidden"/>
               <Style.Triggers>
                  <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Value="True">
                     <Setter Property="Visibility" Value="Visible"/>
                  </DataTrigger>
               </Style.Triggers>
            </Style>
         </CheckBox.Style>
      </CheckBox>
   </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

如果要在正常状态下而不是在选定状态下应用前景色,请添加此RowStyle

<DataGrid.RowStyle>
   <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}">
      <Style.Triggers>
         <DataTrigger Binding="{Binding IsSelectedForOrder}" Value="True">
            <Setter Property="Foreground" Value="Gray"/>
         </DataTrigger>
      </Style.Triggers>
   </Style>
</DataGrid.RowStyle>

如果您也想在选定状态下应用样式,请添加此CellStyle。在这种情况下,将使用RelativeSource绑定来访问包含IsSelectedForOrder的行的数据上下文。

<DataGrid.CellStyle>
   <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}">
      <Style.Triggers>
         <DataTrigger Binding="{Binding DataContext.IsSelectedForOrder, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Value="True">
            <Setter Property="Foreground" Value="Gray"/>
         </DataTrigger>
      </Style.Triggers>
   </Style>
</DataGrid.CellStyle>