Как изменить цвет ячейки в WPF DataGrid на основе свойства объекта в itemsource? - PullRequest
1 голос
/ 08 августа 2010

У меня есть очень простой объект, называемый CellData. Определяется как:

public sealed class CellData
{
    internal string DisplayText
    {
        get;
        set;
    }

    public string Color
    {
        get;
        set;
    }

    public override string ToString()
    {
        return this.DisplayText;
    }
}

Я могу заставить его отображаться с помощью инструментария WPF DataGrid. Однако я хочу иметь возможность изменять цвет фона каждой ячейки в зависимости от того, какие данные находятся в ячейке. У меня проблемы с пониманием того, какой тип привязки мне нужно сделать, потому что я не вижу, как добраться до объекта CellData в моем DataTrigger. Я пробовал следующее и несколько других вариантов, но не могу заставить его работать:

            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(CellData).Color, Mode=OneWay}" Value="1">
                <Setter Property="Background" Value="Red" />
                <Setter Property="Foreground" Value="White" />
            </DataTrigger>

Я довольно новичок в привязке данных XAML, поэтому любые предложения будут с благодарностью. Спасибо.

Ответы [ 2 ]

1 голос
/ 08 августа 2010

Я предполагаю, что у вас есть объект RowData, который содержит несколько объектов CellData, что вы связали ItemsSource DataGrid со списком объектов RowData и используете DataGridTextColumns или другие DataGridBoundColumns, связанные со свойствами в RowData,может быть, просто с помощью AutoGenerateColumns = "True".

Проблема в том, что DataContext для ячейки - это на самом деле RowData, а не CellData.Привязка используется только для свойства Text TextBlock и TextBox.Это полезно, если вы хотите, чтобы триггеры основывались на других свойствах объекта RowData, но затрудняют такие сценарии, как ваш, где у вас есть богатая структура данных для данных ячейки.

Если вы создаете столбцы явно, вы можете просто снова использовать свойство для столбца в триггере:

<DataGridTextColumn Binding="{Binding Foo}">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Style.Triggers>
                <!-- DataContext is the row, so start 
                     binding path with Foo property -->
                <DataTrigger Binding="{Binding Foo.Color}" Value="1">
                    <Setter Property="Background" Value="Red" />
                    <Setter Property="Foreground" Value="White" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.CellStyle>
</DataGridTextColumn>

К сожалению, это не позволит вам разделить стиль между столбцамитак как это специфично для имени столбца.Если вы хотите сделать это, вам может понадобиться создать собственный подкласс DataGridColumn со свойством типа Binding, которое применяется к свойству DataContext объекта, возвращаемого GenerateElement и GenerateEditingElement.

(Использование привязки с RelativeSource of Self, как вы делали в своем примере, дает вам элемент в визуальном дереве, а не его DataContext, что не поможет вам добраться до объекта CellData.)

0 голосов
/ 08 августа 2010

Вы можете использовать ValueConverter: создайте привязку между цветом фона ячейки и свойством Color вашего объекта, затем добавьте ValueConverter, чтобы убедиться, что ваши данные правильно преобразованы в объект, необходимый для установки фона.

...