【问题标题】:How to change the text color for an unchecked row in xaml如何更改xaml中未选中行的文本颜色
【发布时间】:2021-02-03 17:17:27
【问题描述】:

我想使用 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>

【问题讨论】:

    标签: wpf xaml checkbox datagrid


    【解决方案1】:

    由于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>
    

    【讨论】:

    • 谢谢!出于某种原因,它不允许我更改前景。我可以改变背景、文字粗细等,但不能改变文字的颜色!你知道如何解决这个问题吗?
    • 它似乎被代码中其他地方的其他属性覆盖。有没有办法防止这种情况发生?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多