如何在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>
我需要组合多个文本,并且我想根据条件显示部分不同样式的新文本。
例如,
我有一个包含列 (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>