如何动态设置行';将文本转换为粗体,使用MVVM、C#和无代码隐藏?
我正在使用.NET、MVVM开发一个WPF页面,没有代码隐藏,使用PropertyChanged。在这个页面中,我有一个包含很多列的DataGrid。 在DB中,其中一列(我们称之为HIGHLIGHT)的值为s或N。如果value=s,整行将为粗体或超粗体。案例N=正常 我在XAML中使用以下代码完成了这项工作:如何动态设置行';将文本转换为粗体,使用MVVM、C#和无代码隐藏?,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,我正在使用.NET、MVVM开发一个WPF页面,没有代码隐藏,使用PropertyChanged。在这个页面中,我有一个包含很多列的DataGrid。 在DB中,其中一列(我们称之为HIGHLIGHT)的值为s或N。如果value=s,整行将为粗体或超粗体。案例N=正常 我在XAML中使用以下代码完成了这项工作: <Style x:Key="TextRowStyle" TargetType="{x:Type TextBlock}" > <Styl
<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>
我曾尝试在这些字段中创建一个转换器,使用:
<Page.Resources>
<vm:HighlightConverter x:Key="HighlightConverter"/>
</Page.Resources>
然后进入网格:
<TextBlock FontWeight={Binding Slab.Highlight, Converter={StaticResource HighlightConverter}}"/>
通过删除x:Key来隐式应用样式怎么样?这将使它在放置在数据网格中时适用于网格中的任何地方。抱歉,这是未经测试的,因为我离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>
为什么不在DataGrid.Resources中创建“本地”样式。整行必须是粗体(S)或普通(N),这是对的吗
使用上面的代码,所有单元格都是正常的,但如果数据行具有Slab.Highlight=S,则所有单元格都将是粗体。代码没有经过测试。也许您必须添加TextBlock.fontwweight或类似的内容。我已经尝试过了,但是TargetType=“DataGridTextColumn”不可用。如果我把“TextBlock”放进去,它不会影响任何东西。如果我将“DataGrid”放入Style.Resources将TargetType=“TextBlock”中,则只有网格线会更改。但是TargetType=“DataGridTextColumn”不可用
怎么回事?我也觉得很奇怪,不知道为什么不可用。然而,当我将此代码放入Page.Resources而不是Datagrid.Resources.Ah时,它是可用的,我错了-DataGridTextColumn不是从FrameworkElement派生的。根据答案,GridCell是更好的选择。我也尝试过,但不起作用。这就是为什么我在页面上使用了这种样式。参考资料,这是另一个测试。@gustavosg:你是对的,你必须将列的ElementStyle
设置为{x:Null}
,隐式样式才能生效……我正在尝试将ElementStyle=“{x:Null}”设置为该数据网格。您知道如何设置为整个Datagrid,而不是在每一列中进行设置吗?当我这样做时,它会以蓝线显示错误:{x:typedatagridtextcolumn},并说:调用的目标抛出了异常。这是因为DataGridTextColumn不是从FrameworkElement(或FrameworkContentElement)派生的。仅FrameworkElement支持样式设置。但是我看不出有什么办法来解决这个问题。@gustavosg:你不能设置列的样式(我没有说别的),我只是说隐式TextBlock
样式只有在所有列的ElementStyle
都为空时才有效。您可以将隐式样式应用于DataGridCell
,但是FontWeight
也会影响TextBox
等。我想,我的目的是根据规则设置网格行的样式,而不是将此样式列设置为column。在这种情况下,你知道我该怎么做吗?
<TextBlock FontWeight={Binding Slab.Highlight, Converter={StaticResource HighlightConverter}}"/>
<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>
<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>