【问题标题】:How can I change a cell of a DataGrid depending on the data it is bound to using MVVM in Silverlight?如何根据在 Silverlight 中使用 MVVM 绑定的数据更改 DataGrid 的单元格?
【发布时间】:2025-11-27 06:00:02
【问题描述】:

我最近发布了相同的问题,但针对 WPF 并得到了答案。问题是答案在 Silverlight 中不起作用。 情况如下:我正在使用 MVVM Light Toolkit,并且我有一个绑定到 ObservableCollection 的 DataGrid。仅显示一个文本列。我希望单元格的文本为粗体或正常,具体取决于显示的对象内部的布尔值。 为了让它在 WCF 中工作,我使用了带有 Syle.Trigger 的样式:

<DataGrid.Resources>
        <Style x:Key="Style1" TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsRead}" Value="False">
                    <Setter Property="FontWeight" Value="Bold" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Title}" ElementStyle="{StaticResource ResourceKey=Style1}" />
    </DataGrid.Columns> 

问题是这在 Silverlight 中不可用。我做了一些研究,发现 VisualStateManager 是触发器的“替代品”,但我从未设法创建编辑 DataGridTextColumn 的状态。我尝试了很多从 GoToState 到 DataStateBehavior 的不同方法......到目前为止没有任何效果。

请帮忙!

谢谢

【问题讨论】:

    标签: silverlight mvvm datagrid expression-blend


    【解决方案1】:

    FontWeight 属性不适用于DataGridTextColumn 列类型。因此,您应该将此列更改为 DataGridTemplateColumn 类型,并在其中添加 TextBlock 控件,并对其应用表达式混合数据触发器。

    代码如下:

    <sdk:DataGridTemplateColumn>
        <sdk:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Title}" VerticalAlignment="Center">
                    <i:Interaction.Triggers>
                        <ic:DataTrigger Binding="{Binding IsRead}" Value="False">
                            <ic:ChangePropertyAction PropertyName="FontWeight" >
                                <ic:ChangePropertyAction.Value>
                                    <FontWeight>Bold</FontWeight>
                                </ic:ChangePropertyAction.Value>
                            </ic:ChangePropertyAction>
                        </ic:DataTrigger>
                    </i:Interaction.Triggers>
                </TextBlock>
            </DataTemplate>
        </sdk:DataGridTemplateColumn.CellTemplate>
    </sdk:DataGridTemplateColumn>
    

    命名空间iic 是这样定义的:

    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
    

    当您安装 Expression Blend SDK 时,必要的库就可用了。

    如果您没有 SDK,可以使用替代方法并编写一个值转换器:

    <TextBlock Text="{Binding Title}" VerticalAlignment="Center" 
        FontWeight="{Binding IsRead, Converter={StaticResource BooleanToFontWeightConverter}}" />
    

    【讨论】:

    • 有效!!谢谢 !!我为 IsRead 的值“True”和 FontWeight 的 Normal 添加了第二个 DataTrigger,以便在 bool 变为 true 时它恢复正常。尽管“FontWeight 属性不适用于 DataGridTextColumn 列类型”,但我觉得很奇怪。对我来说,文字和字体是 bro 和 sis :)。再次感谢您的帮助。