2010-05-13 2 views
3

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

Мой 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> 

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

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

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

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

ответ

7

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

Поскольку ваш пример показывает, что у вас есть AutoGenerateColumns набор к ложным, я предполагаю, что вы создаете столбцы себе что-то вроде 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 непосредственно из стиля на уровне сетки, как и вы, не делая этого для каждого столбца отдельно. Но у меня нет реальной модели данных, которую вы должны проверить.

+0

Awesome! Это работало именно так, как мне было нужно. Единственное, что мне пришлось изменить, это добавить значение Value = true в DataTrigger (так что это срабатывает, когда IsDirty истинно) – KrisTrip

+1

Я пытаюсь сделать именно это, но писать свой стиль в xaml? Это возможно? – jrwren

+0

Это замечательно. Однако - я пытаюсь сделать это в WPF, и это похоже на код из пространства имен System.Windows.Controls. Есть ли способ сделать что-то подобное в System.Windows.Forms ??? Я не могу найти ресурс где угодно. Благодаря! – mpsyp

 Смежные вопросы

  • Нет связанных вопросов^_^