微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在C#中按条件设置DataGrid中某些部分文本的样式

如何解决如何在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;
    }
}

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

enter image description here

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

enter image description here

解决方法

您需要一个带有 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>

result

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?