我最近发布了同样的问题但是对于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
答案 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>
命名空间i
和ic
定义如下:
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}}" />