2010-05-13 18 views
3

J'essaie de changer la couleur d'une cellule en jaune si la valeur a été mise à jour dans le DataGrid.WPF Toolkit DataGridCell Style DataTrigger

Mon 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> 

La grille est liée à une liste de tableaux (afficher un tableau de valeurs peu comme Excel serait). Chaque valeur du tableau est un objet personnalisé qui contient une propriété de dépendance IsDirty. La propriété IsDirty est définie lorsque la valeur est modifiée.

Quand je lance ceci:

  • modifier une valeur dans la colonne 1 = toute la ligne jaunit
  • modifier une valeur dans une autre colonne = rien ne se passe

Je veux seulement changé cellule pour aller jaune, peu importe quelle colonne son. Voyez-vous quelque chose de mal avec mon XAML?

Répondre

7

La raison pour laquelle cela se produit est que DataContext est définie au niveau de la ligne et ne change pas pour chaque DataGridCell. Ainsi, lorsque vous liez à IsDirty, il se lie à la propriété de l'objet de données de niveau ligne et non à celle de niveau cellule.

Depuis votre exemple montre que vous avez AutoGenerateColumns ensemble à faux, je suppose que vous générer des colonnes vous avez quelque chose comme DataGridTextColumn avec Binding propriété définie sur la liaison au champ de la valeur réelle. Pour obtenir le style cellulaire changé en jaune, vous auriez à changer CellStyle sur chaque DataGridColumn comme ceci:

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

Vous pouvez essayer de changer DataContext de chaque cellule en utilisant DataGridColumn.CellStyle. Peut-être seulement alors vous serez capable de lier des cellules à 'IsDirty' directement à partir du style au niveau de la grille comme vous le faites sans le faire pour chaque colonne individuellement. Mais je n'ai pas de modèle de données réel à tester.

+0

Génial! Cela a fonctionné exactement comme j'en avais besoin. La seule chose que j'ai dû changer était d'ajouter une Value = true à DataTrigger (donc ça se déclenche quand IsDirty est vrai) – KrisTrip

+1

J'essaye de faire exactement cela mais d'écrire mon style dans xaml? Est-ce possible? – jrwren

+0

C'est génial. Cependant - j'essaye de faire ceci dans WPF, et ceci semble être le code de l'espace de noms de System.Windows.Controls. Y at-il un moyen de faire quelque chose de similaire dans System.Windows.Forms ??? Je ne trouve pas de ressource nulle part. Merci! – mpsyp