如何根据在Silverlight中使用MVVM绑定的数据来更改DataGrid的单元格?

时间:2011-11-27 15:34:28

标签: silverlight mvvm datagrid expression-blend

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

<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的一系列不同方法......到目前为止没有任何工作。

请帮助!

THX

1 个答案:

答案 0 :(得分:3)

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}}" />