如何使用MVVM,C#和没有Code-Behind将Row的文本动态设置为粗体?

时间:2012-01-09 16:41:57

标签: c# wpf mvvm datagrid

我正在使用.NET,MVVM开发一个WPF页面,没有代码隐藏,使用PropertyChanged。在这个页面中,我有一个包含很多列的DataGrid。 进入DB,其中一个列,我们称之为HIGHLIGHT,将具有值S或N.如果value = S,则整行将为Bold或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}"/>

我需要什么:

我的数据库的每个表有几个列,超过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}}"/>

有没有人知道如何才能使这项工作?

祝你好运, 古斯塔沃。

3 个答案:

答案 0 :(得分:9)

为什么你不在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或类似的东西。

答案 1 :(得分:2)

通过删除x:Key隐式应用样式怎么样?当它放在DataGrid.Resources

中时,它应该适用于网格中的任何位置

答案 2 :(得分:0)

这可能有用。对不起,它没有经过测试,因为我离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>