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

Я использую легкий инструментарий MVVM, и у меня есть DataGrid, привязанный к ObservableCollection.Отображается только один текстовый столбец.Я хотел бы, чтобы текст ячейки был жирным или обычным в зависимости от логического значения, которое находится внутри отображаемого объекта.Я подумал, что мог бы использовать RelayCommands, но они принимают только 1 параметр, и мне нужно по крайней мере 2, чтобы получить CellContent (DataGridRowEventArgs и сам DataGrid).Я попытался запустить делегат RelayCommand Execute для события «LoadingRow», но с помощью только одного параметра я не смог этого сделать.

Вот таблица данных в XAML:

<DataGrid x:Name="dataGrid1" HorizontalAlignment="Left" Margin="112,34,0,8" Width="100" IsReadOnly="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" ItemsSource="{Binding CurrentNewsList}" AutoGenerateColumns="False" SelectedIndex="0">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Title}" MinWidth="92" Width="Auto" FontFamily="Segoe UI" Foreground="Black" FontWeight="{Binding CurrentNewsList[0].MyFont}"/>
        </DataGrid.Columns>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <Custom:EventToCommand Command="{Binding NewsSelectedCommand}" CommandParameter="{Binding SelectedIndex, ElementName=dataGrid1}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </DataGrid>

Я установил сетку в Blend.Обратите внимание, что FontWeight связан как "{Binding CurrentNewsList [0] .MyFont}".Это правильно ?Я также пытался "{Binding MyFont}", но оба получили одинаковый результат: No BOld: (

MyFont установлен в конструкторе объектов с логическим значением:

MyFont = newIsRead ? FontWeights.Normal : FontWeights.Bold;

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

Thx

Ответы [ 3 ]

4 голосов
/ 23 ноября 2011

Вы можете просто использовать неявный стиль и триггер:

<DataGrid.Resources>
    <Style TargetType="DataGridCell">
        <Style.Triggers>
            <DataTrigger Binding="{Binding MyBoolean}" Value="True">
                <Setter Property="TextElement.FontWeight" Value="Bold" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

(Если у вас когда-либо будет больше столбцов, вы можете просто использовать стили для столбца (ElementStyle & ElementEditingStyle) вместо этого, чтобы ограничить эффект)

1 голос
/ 25 ноября 2011

Вот как мне удалось сделать это с помощью решения H.B:

            <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>
1 голос
/ 23 ноября 2011

В такой ситуации я обычно создаю «объект модели», который специально предназначен для привязки.Таким образом, вместо привязки к наблюдаемой коллекции «Customer», вы привязываетесь к наблюдаемой коллекции «CustomerModel», где объект модели имеет свойство «CustomerName», а затем некоторое другое свойство, которое соответствует желаемому шрифту (или фактическомуОбъект Font, или какое-либо перечисление, которое вы анализируете через конвертер значений, если вы не хотите, чтобы ваш уровень VM знал о проблемах представления).Этот объект модели может выяснить, что сделать доступным, в зависимости от указанного вами логического свойства.

...