WPF Toolkit DataGridCell Стиль DataTrigger - PullRequest
3 голосов
/ 14 мая 2010

Я пытаюсь изменить цвет ячейки на Желтый, если значение было обновлено в DataGrid.

Мой XAML:

<toolkit:DataGrid x:Name="TheGrid"
                  ItemsSource="{Binding}"
                  IsReadOnly="False"
                  CanUserAddRows="False"
                  CanUserResizeRows="False"
                  AutoGenerateColumns="False"
                  CanUserSortColumns="False"                             
                  SelectionUnit="CellOrRowHeader" 
                  EnableColumnVirtualization="True" 
                  VerticalScrollBarVisibility="Auto"
                  HorizontalScrollBarVisibility="Auto">
    <toolkit:DataGrid.CellStyle>
        <Style TargetType="{x:Type toolkit:DataGridCell}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsDirty}" Value="True">
                    <Setter Property="Background" Value="Yellow"/>
                 </DataTrigger>
            </Style.Triggers>
        </Style>
    </toolkit:DataGrid.CellStyle>
</toolkit:DataGrid>

Сетка привязана к списку массивов (отображая таблицу значений, как в Excel). Каждое значение в массиве является пользовательским объектом, который содержит свойство зависимостей IsDirty. Свойство IsDirty устанавливается при изменении значения.

Когда я запускаю это:

  • изменить значение в столбце 1 = вся строка становится желтой
  • изменить значение в любом другом столбце = ничего не происходит

Я хочу, чтобы только измененная ячейка стала желтой, независимо от того, в каком столбце она находится. Вы видите что-то не так с моим XAML?

1 Ответ

8 голосов
/ 18 мая 2010

Причина, по которой это происходит, заключается в том, что DataContext устанавливается на уровне строки и не изменяется для каждого DataGridCell.Поэтому, когда вы привязываетесь к IsDirty, он привязывается к свойству объекта данных уровня строки, а не к уровню ячейки.

Поскольку в вашем примере показано, что для AutoGenerateColumns установлено значение false, я предполагаю, что вы сами генерируете столбцы, например, DataGridTextColumn со свойством Binding, установленным на привязку к полю фактического значения.Чтобы изменить стиль ячейки на желтый, вам нужно изменить CellStyle для каждого DataGridColumn следующим образом:

foreach (var column in columns)
{
    var dataColumn =
        new DataGridTextColumn
            {
                Header = column.Caption,
                Binding = new Binding(column.FieldName),
                CellStyle = 
                new Style
                    {
                        TargetType = typeof (DataGridCell),
                        Triggers =
                            {
                                new DataTrigger
                                    {
                                        Binding = new Binding(column.FieldName + ".IsDirty"),
                                        Setters =
                                            {
                                                new Setter
                                                    {
                                                        Property = Control.BackgroundProperty,
                                                        Value = Brushes.Yellow,
                                                    }
                                            }
                                    }
                            }
                    }
            };
    _dataGrid.Columns.Add(dataColumn);
}

Вы можете поэкспериментировать с изменением DataContext каждой ячейки, используя DataGridColumn.CellStyle.Возможно, только тогда вы сможете привязать ячейки к 'IsDirty' непосредственно из стиля сетки, как вы делаете это, не делая это для каждого столбца отдельно.Но у меня нет реальной модели данных, вы должны это проверить.

...