如何解决如何在C#中按条件设置DataGrid中某些部分文本的样式
我需要组合多个文本,并且我想按条件显示部分不同样式的新文本。
例如
我有一个带列的数据表(代码、选择1、标准1、选择2、标准2、选择3、标准3、选择4、标准4)。我想在数据网格的配置列中组合代码、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" 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","Option_ASD",false);
optionalPro.Rows.Add("A02","Option_AXC","Option_CAD","Option_AWD",false);
optionalPro.Rows.Add("A03","Option_SWD","Option_ZAS","Option_YHL",true);
optionalPro.Rows.Add("A04","Option_AAZ","Option_MNK","Option_DHG","Option_AFL",false);
optionalPro.Rows.Add("A05","Option_CDE","Option_KLM","Option_SLH","Option_AXD",true);
optionalPro.Rows.Add("A06","Option_HGF","Option_SSD","Option_CQL","Option_KHG",true);
grid1.ItemsSource = optionalPro.defaultview;
}
}
结果,我看到了那个屏幕:
但我想像这样显示配置列:
解决方法
您需要一个带有 FontWeight、FontStyle 和 TextDecorations 设置器的 TextBlock 常规样式。
使用 StaticResource 在 CellTemplate 中应用它
DataTrigger 绑定到 Tag 属性以便重用它,因为每个 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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。