2016-10-03 3 views
0

Ich versuche, eine DataTrigger basierend auf den Vergleichswerte von zwei Zellen in der gleichen Zeile festzulegen. Meine Schwierigkeit besteht darin, dass die Zellen keine Eigenschaften desselben Artikels sind (und nicht sein können). Das Gitter wird in Code-Behind generiert.Datentrigger-Vergleich zweier Spaltenwerte

public class EqualityConverter : IValueConverter 
{ 
    public object Convert(object values, Type targetType, object parameter, CultureInfo culture) 
    { 
     string currentValue = values.ToString(); 
     string compareToValue = Column[2].Item.Value.ToString(); //This clearly doesn't work, but it's the intent I'm after. 

     if (currentValue.Equals(compareToValue)) 
      return false; 
     return true; 
    } 

XAML (Binding Path=Value) funktioniert super. (ConverterParameter = Column2.Value) ist, wo mein Problem ist. Irgendwelche Vorschläge, wie ich das abrufen kann ???

<DataTrigger Binding="{Binding Path=Value, Converter={StaticResource EqualityConverter}}" Value="True"> 
    <Setter Property="Background" Value="Yellow" /> 
</DataTrigger> 

Der Grund, warum ich nicht auf die Elementeigenschaft binden kann, ist der Zellenwert ein Element von selbst: Also ich versuche, auf die Eigenschaft „Wert“ von Spalte2 zu vergleichen.

public class GenericProperty : INotifyPropertyChanged 
{ 
    public GenericProperty(string name, object value) 
    { 
     Name = name; 
     Value = value; 
    } 

    public string Name { get; private set; } 
    public object Value { get; set; } 
+0

haben Sie die Antwort – AnjumSKhan

+0

Hey Anjum, Entschuldigung für meine Verzögerung bei der Erteilung einer Antwort. Zuerst vielen Dank für Ihre Hilfe. Ich habe es gesehen, obwohl mein erster Versuch erfolglos war. ABER - ich bin mit diesem Loaded-Event bis jetzt nicht vertraut und möchte es zumindest noch einmal frisch machen. Wird in Kürze folgen. – ctalley5

Antwort

0

Nach viel Aufwand eine einfachere, direkte Lösung zu finden ... Ich beendete eine Eigenschaft auf mein Objekt auf Hinzufügen als Platzhalter zu verwenden Attribut-Werte zu identifizieren:

 public GenericProperty(string name, object value, string match) 
    { 
     Name = name; 
     Value = value; 
    ** Match = match; ** 
    } 

    public string Name { get; private set; } 
    public object Value { get; set; } 
    public string Match { get; set; } 

ich dann ein Verfahren, das durch meine Sammlung Schleifen und legt Wert meiner neuen Eigenschaft auf „true“ für Artikel, die meinen „Spalte 2“ Artikel entsprechen:

 private void IdentifyMatchingItems(ObservableCollection<GenericObject> groupedCollection) 
    { 
     foreach (var collectionObject in groupedCollection) 
     { 
      int x = collectionObject.Properties.Count; 
      int propertyCount = x - 1; 
      string masterValue = collectionObject.Properties[2].Value.ToString(); 
      //   string ObjectNotNull = collectionObject.Properties[propertyNumber].Value.ToString(); 

      for (int i = 2; i <= propertyCount; i++) 
      { 
       if (collectionObject.Properties[i].Value.Equals(masterValue)) 
       { 
        collectionObject.Properties[i].Latest = "yes"; 
       } 
      } 
     } 
    } 

Schließlich habe ich eine Datatrigger, die meine Datagrid-Zelle Arten basierten auf der "Match" -Eigenschaft.

1

DataContext jeder DataGridCell ist der Datensatz (Artikel) in diesem DataGridRow angezeigt. Also, alles, was Sie tun müssen, ist nur den Wert der Eigenschaft zu vergleichen, die in Ihrem zweiten Column angezeigt wird.

<DataTrigger Binding="{Binding secondColumnProp}" value="True"> 
    <Setter Property="Background" Value="Yellow"/> 
</DataTrigger> 

UPDATE # 1 nach Nutzerkommentare

Sie haben Loaded Fall DataGridCell, verwenden, da bis zu diesem Zeitpunkt Bindungen ausgewertet würden.

<DataGrid.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <EventSetter Event="Loaded" Handler="DataGridCell_Loaded"/> 
     </Style> 
    </DataGrid.CellStyle> 

    void DataGridCell_Loaded(object sender, RoutedEventArgs e) 
    { 
     DataGridCell cell = sender as DataGridCell; 
     DependencyObject reference = cell; 
     while (reference.GetType() != typeof(DataGridRow)) 
      reference = VisualTreeHelper.GetParent(reference); 

     DataGridRow row = reference as DataGridRow; 

     while (reference.GetType() != typeof(DataGrid)) 
      reference = VisualTreeHelper.GetParent(reference); 

     DataGrid grid = reference as DataGrid; 
     FrameworkElement elem = grid.Columns[2].GetCellContent(row); 

     // use elem.DataContext, or traverse elem's visualtree to do something 
     // code below is just an example 
     if (elem is TextBlock) 
     { 
      System.Diagnostics.Debug.WriteLine((elem as TextBlock).Text); 
      if ((elem as TextBlock).Text == "34") 
       cell.Background = Brushes.DarkMagenta; 
     } 
    } 
+0

Aber darin liegt mein Problem. Das Raster wird dynamisch generiert und das DataGridRow ist kein einzelner Datensatz (Element). Ich habe Bindungseinstellungen für alle dynamisch erzeugten Spalten ... aber ich muss die Gleichheit von jedem von ihnen mit Spalte [2] vergleichen. Ich werde meine Frage bearbeiten, um zu klären. – ctalley5

+0

@ ctalley5 siehe aktualisierte Antwort – AnjumSKhan

+0

Anjum, danke für die obige Lösung. In einem typischen Szenario glaube ich, dass deine Antwort die beste ist. Nach vielen Versuchen konnte ich Cellstyle nicht verwenden, da ich das dataGrid manuell erstellen und Datatemplates aus Code-behind zuweisen musste. – ctalley5