2010-05-13 122 views
3

我試圖將單元格的顏色更改爲黃色,如果該值已在DataGrid中更新。WPF工具包DataGridCell樣式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> 

網格被綁定到陣列的列表(顯示值的表種如Excel會)。數組中的每個值都是一個包含IsDirty依賴項屬性的自定義對象。當值更改時,IsDirty屬性被設置。

當我運行此:

  • 變化列中的值1 =整排進黃
  • 變化的值在任何其他列=什麼也沒有發生

我只想要改變細胞無論其中哪一列都變黃。你看到我的XAML有什麼問題嗎?

回答

7

發生這種情況的原因是因爲DataContext設置在行級別,並且每個DataGridCell都不會更改。因此,當綁定到IsDirty時,它綁定到行級數據對象的屬性,而不是單元級數據對象的屬性。

由於您的例子表明,你有AutoGenerateColumns設置爲false,我假設你生成列自己有類似DataGridTextColumnBinding屬性設置爲結合實際值字段。若要單元格樣式變爲黃色,你不得不在每個DataGridColumn喜歡這種改變CellStyle

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); 
} 

您可以使用DataGridColumn.CellStyle改變每個單元的DataContext實驗。也許只有這樣,你才能像單獨一樣直接從網格級風格將單元格綁定到「IsDirty」,而不必單獨爲每個列進行。但是我沒有實際的數據模型來測試它。

+0

太棒了!這工作正是我需要它。我唯一需要改變的是爲DataTrigger添加一個Value = true(因此當IsDirty爲true時觸發) – KrisTrip 2010-05-19 21:48:37

+1

我正在嘗試完成此操作,但是在xaml中編寫了我的樣式?這可能嗎? – jrwren 2011-06-10 19:33:18

+0

這太好了。但是 - 我試圖在WPF中這樣做,這似乎是來自System.Windows.Controls命名空間的代碼。有沒有辦法在System.Windows.Forms中做類似的事情?我無法在任何地方找到資源。謝謝! – mpsyp 2017-09-07 16:29:03