如何动态设置Row';s文本为粗体,使用MVVM、C#且无代码隐藏

本文关键字:使用 MVVM 隐藏 代码 文本 动态 何动态 设置 Row | 更新日期: 2023-09-27 18:19:46

我正在使用.NET、MVVM、无代码隐藏、使用PropertyChanged开发一个WPF页面。在这个页面中,我有一个包含许多列的DataGrid。在DB中,其中一列(我们称之为HIGHLIGHT)将具有值s或N。如果值=s,则整行将为粗体或ExtraBold。情况N=正常。

我在XAML中使用以下代码完成了这项工作:

        <Style x:Key="TextRowStyle" TargetType="{x:Type TextBlock}" >
        <Style.Triggers>
            <DataTrigger Binding="{Binding Slab.Highlight}" Value="S">
                <Setter Property="FontWeight" Value="ExtraBold"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

但这样做,我必须在每个列中放入这段代码才能使其工作(注意ElementStyle):

<DataGridTextColumn Header="Test" Binding="{Binding SlabSeq}" ElementStyle="{StaticResource TextRowStyle}"/>

我需要什么:

我的DB的每个表都有几个列,超过60、70,我正在寻找一种更容易的方法,比如我制作的StaticResource TextRowStyle。。。

我做的另一件事是一个转换器:

public class HighlightConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (System.Convert.ToChar(value).Equals("S"))
            return FontWeights.ExtraBold;
        else
            return FontWeights.Normal;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return FontWeights.ExtraBold;
    }
}

我试着在这些字段中制作一个转换器,使用:

<Page.Resources>
    <vm:HighlightConverter x:Key="HighlightConverter"/>
</Page.Resources>

并进入网格:

<TextBlock FontWeight={Binding Slab.Highlight, Converter={StaticResource HighlightConverter}}"/>

有人知道我该怎么做吗?

谨致问候,古斯塔沃。

如何动态设置Row';s文本为粗体,使用MVVM、C#且无代码隐藏

为什么不在DataGrid.Resources中创建"本地"样式。整行必须是粗体(S)或普通(N),我说得对吗?

<DataGrid.Resources>
  <Style TargetType="{x:Type DataGridCell}" >
     <Setter Property="FontWeight" Value="Normal"/>
     <Style.Triggers>
        <DataTrigger Binding="{Binding Slab.Highlight}" Value="S">
            <Setter Property="FontWeight" Value="ExtraBold"/>
        </DataTrigger>
    </Style.Triggers>
  </Style>
</DataGrid.Resources>

如果代码在上面,所有单元格都是正常的,但如果数据行有Slab.Highlight=S,则所有单元格都将是粗体。代码没有经过测试。也许你必须添加TextBlock.Fontweight或类似的东西。

通过删除x:Key来隐式应用样式怎么样?这将使它在放置在DataGrid.Resources中时适用于网格中的任何位置。

这可能会奏效。抱歉,它还没有经过测试,因为我离IDE很远。

            <DataGrid>
            <DataGrid.Resources>
                <Style TargetType="DataGridTextColumn">
                    <Style.Resources>
                        <Style TargetType="TextBlock">
                            <Setter Property="FontWeight" Value="{Binding Slab.Highlight, Converter={StaticResource HighlightConverter}}"/> 
                        </Style>
                    </Style.Resources>
                </Style>
            </DataGrid.Resources>
        </DataGrid>