如何在C#中根据条件设置DataGrid中部分文本的样式

How to set style of some parts of text in DataGrid by condition in C#

我需要组合多个文本,并且我想根据条件显示部分不同样式的新文本。

例如,

我有一个包含列 (code,opt1,std1,opt2,std2,opt3,std3,opt4,std4) 的数据表。我想在数据网格的配置列中组合代码、opt1、opt2、opt3 和 opt4 行值。

但如果 std1 为真,我还想显示 opt1 值(在配置中)粗体、斜体和下划线;如果 std2 为真,我想显示 opt2 值(在配置中)粗体、斜体和下划线;如果 std3 为真,我想显示 opt3 值(在配置中)粗体、斜体和下划线;如果 std4 为真,我想显示 opt4 值(在配置中)粗体、斜体和下划线。

我的 xaml 代码是这样的:

<Grid>
    <DataGrid x:Name="grid1" ItemsSource="{Binding Items}" HorizontalAlignment="Left"  Margin="10,10,0,0" VerticalAlignment="Top"  CanUserSortColumns="True"  CanUserAddRows="False"  AutoGenerateColumns="False" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding code}"  Header="code" />
            <DataGridTemplateColumn   Header="configuration" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Path=code}"/>
                            <TextBlock Text=" - "/>
                            <TextBlock Text="{Binding Path=opt1}">
                                //How to use Style and Trigger here?
                            </TextBlock>
                            <TextBlock Text=" - "/>
                            <TextBlock Text="{Binding Path=opt2}">
                                //How to use Style and Trigger here?
                            </TextBlock>
                            <TextBlock Text=" - "/>
                            <TextBlock Text="{Binding Path=opt3}">
                                //How to use Style and Trigger here?
                            </TextBlock>
                            <TextBlock Text=" - "/>
                            <TextBlock Text="{Binding Path=opt4}">
                                //How to use Style and Trigger here?
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Binding="{Binding opt1}"  Header="opt1" />
            <DataGridCheckBoxColumn Binding="{Binding std1}"  Header="std1" />
            <DataGridTextColumn Binding="{Binding opt2}"  Header="opt2" />
            <DataGridCheckBoxColumn Binding="{Binding std2}"  Header="std2" />
            <DataGridTextColumn Binding="{Binding opt3}"  Header="opt3" />
            <DataGridCheckBoxColumn Binding="{Binding std3}"  Header="std3" />
            <DataGridTextColumn Binding="{Binding opt4}"  Header="opt4" />
            <DataGridCheckBoxColumn Binding="{Binding std4}"  Header="std4" />
        </DataGrid.Columns>
    </DataGrid>

</Grid>

和类似的 C# 代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataTable optionalPro = new DataTable();

        optionalPro.Columns.Add("code", typeof(string));
        optionalPro.Columns.Add("opt1", typeof(string));
        optionalPro.Columns.Add("std1", typeof(byte));
        optionalPro.Columns.Add("opt2", typeof(string));
        optionalPro.Columns.Add("std2", typeof(byte));
        optionalPro.Columns.Add("opt3", typeof(string));
        optionalPro.Columns.Add("std3", typeof(byte));
        optionalPro.Columns.Add("opt4", typeof(string));
        optionalPro.Columns.Add("std4", typeof(byte));

        optionalPro.Rows.Add("A01", "Option_ABC",false, "Option_ADB", true, "Option_CAF", true, "Option_ASD", false);
        optionalPro.Rows.Add("A02", "Option_AXC",true, "Option_ADB", true, "Option_CAD", false, "Option_AWD", false);
        optionalPro.Rows.Add("A03", "Option_AXC",true, "Option_SWD", false, "Option_ZAS", true, "Option_YHL", true);
        optionalPro.Rows.Add("A04", "Option_AAZ",false, "Option_MNK", true, "Option_DHG", true, "Option_AFL", false);
        optionalPro.Rows.Add("A05", "Option_CDE",true, "Option_KLM", true, "Option_SLH", false, "Option_AXD", true);
        optionalPro.Rows.Add("A06", "Option_HGF",false, "Option_SSD", false, "Option_CQL", false, "Option_KHG", true);

        grid1.ItemsSource = optionalPro.DefaultView;
    }
}

结果,我看到了那个屏幕:

但我想像这样显示配置栏:

您需要为 TextBlock 使用常规样式,为 FontWeight、FontStyle 和 TextDecorations 使用 setter。

使用 StaticResource 在 CellTemplate 中应用它

DataTrigger 绑定到标记 属性 以便重用它,因为每个 TextBlock 使用不同的 std 属性。在 CellTemplate 中,每个 TextBlock 都有额外的标签绑定。

DataTrigger 值为 1 因为 std 列定义为 byte 类型:true 转换为 1,false 转换为 0

<DataGrid>
 <DataGrid.Resources>
  <Style TargetType="TextBlock" x:Key="cfgText">
   <Style.Triggers>
    <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="1">
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontStyle" Value="Italic"/>
        <Setter Property="TextDecorations" Value="Underline"/>
    </DataTrigger>
   </Style.Triggers>
  </Style>
 </DataGrid.Resources>
 <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding code}"  Header="code" />
    <DataGridTemplateColumn   Header="configuration" >
     <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
       <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Path=code}"/>
        <TextBlock Text=" - "/>
        <TextBlock Text="{Binding Path=opt1}" Tag="{Binding Path=std1}" Style="{StaticResource cfgText}"/>
        <TextBlock Text=" - "/>
        <TextBlock Text="{Binding Path=opt2}" Tag="{Binding Path=std2}" Style="{StaticResource cfgText}"/>
        <TextBlock Text=" - "/>
        <TextBlock Text="{Binding Path=opt3}" Tag="{Binding Path=std3}" Style="{StaticResource cfgText}"/>
        <TextBlock Text=" - "/>
        <TextBlock Text="{Binding Path=opt4}" Tag="{Binding Path=std4}" Style="{StaticResource cfgText}"/>
       </StackPanel>
      </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTextColumn Binding="{Binding opt1}"  Header="opt1" />
    <DataGridCheckBoxColumn Binding="{Binding std1}"  Header="std1" />
    <DataGridTextColumn Binding="{Binding opt2}"  Header="opt2" />
    <DataGridCheckBoxColumn Binding="{Binding std2}"  Header="std2" />
    <DataGridTextColumn Binding="{Binding opt3}"  Header="opt3" />
    <DataGridCheckBoxColumn Binding="{Binding std3}"  Header="std3" />
    <DataGridTextColumn Binding="{Binding opt4}"  Header="opt4" />
    <DataGridCheckBoxColumn Binding="{Binding std4}"  Header="std4" />
 </DataGrid.Columns>
</DataGrid>