Как я могу изменить ячейку DataGrid в зависимости от данных, с которыми она связана, используя MVVM в Silverlight? - PullRequest
2 голосов
/ 27 ноября 2011

Я недавно опубликовал тот же вопрос, но для WPF, и получил ответ. Дело в том, что ответ не работает в Silverlight. Вот ситуация: я использую MVVM Light Toolkit, и у меня есть DataGrid, привязанный к ObservableCollection. Отображается только один текстовый столбец. Я хотел бы, чтобы текст ячейки был жирным или обычным в зависимости от логического значения, которое находится внутри отображаемого объекта. Чтобы он работал в 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 ... пока ничего не получалось.

Пожалуйста, помогите!

Thx

1 Ответ

3 голосов
/ 27 ноября 2011

Свойство 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}}" />
...