2016-06-26 19 views
0

Was ist die richtige DataTrigger-Bindung für DataContext-Eigenschaften? Ich habe einen Datenraster, die wie folgt gebunden ist:WPF DataGrid DataTrigger-Bindung an DataContext-Eigenschaft

XAML:

<DataGrid x:Name="dataGrid" Grid.Row="4" Grid.ColumnSpan="2" 
    ItemsSource="{Binding}" 
    CellStyle="{StaticResource RowStateStyle}" 
> 
</DataGrid> 

In CS- das Gitter auf eine Datentabelle gebunden ist, daher die Datacontext für eine Zelle ist DataRowView, Reihe als Eigenschaft enthält:

// DataTable containing lots of rows/columns 
dataGrid.DataContext = dataTable; 

Edit:

zu Ashs Lösung verweis bearbeitet ich den Stil und setzen in Trig gers für Unverändert und Geändert:

Auslösen auf Content.Text funktioniert tadellos, so tut Unchanged. Wenn ich jedoch eine Zelle ändere (also DataRowState = Modified), passiert nichts und die Farbe bleibt grün. Irgendeine Lösungsmöglichkeit?

Antwort

1

Datatrigger funktioniert für mich, wenn ich

  1. Verwendung DataContext.Row.RowState Weg

  2. nicht Mode=TwoWay

  3. verwenden und entfernen Enum Name DataRowState wenn gesetzt Wert

<DataTrigger Binding="{Binding Path=DataContext.Row.RowState, 
      RelativeSource={RelativeSource Self}}" 
      Value="Unchanged"> 
    <Setter Property="Foreground" Value="Red" /> 
</DataTrigger> 

Ich habe eine andere Stelle gefunden

Zusammenhang mit diesem Problem WpfToolkit DataGrid: Highlight modified rows

Es gibt keinen Standardmechanismus, der über RowState Änderungen benachrichtigt. Aber es ist möglich, eine in einer abgeleiteten Datatable-Klasse zu erstellen:

public class DataTableExt: DataTable 
{ 
    protected override DataRow NewRowFromBuilder(DataRowBuilder builder) 
    { 
     return new DataRowExt(builder); 
    } 

    protected override void OnRowChanged(DataRowChangeEventArgs e) 
    { 
     base.OnRowChanged(e); 
     // row has changed, notifying about changes 
     var r = e.Row as DataRowExt; 
     if (r!= null) 
      r.OnRowStateChanged(); 
    } 
} 

mit einer abgeleiteten DataRow Klasse:

public class DataRowExt: DataRow, INotifyPropertyChanged 
{ 
    protected internal DataRowExt(DataRowBuilder builder) : base(builder) 
    { 
    } 

    internal void OnRowStateChanged() 
    { 
     OnPropertyChanged("RowState"); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

leider immer noch da bin ich noch nicht. Siehe meinen bearbeiteten Post. – ray

+0

@ray, meine Vermutung ist, dass 'DataRow' kein Ereignis oder keine Benachrichtigung auslöst, wenn' RowState' sich ändert. kann nicht überprüfen oder schlagen Sie jetzt keine Lösung – ASh

+0

, wenn ich das Gitter "neu zeichnen" (z. B. Umsortieren), Änderungen werden visualisiert. Also entweder ein kleiner Hack: Zeichnen Sie die Zeile neu, wenn sich eine Zelle ändert oder vielleicht die Lösung [von hier] (http://stackoverflow.com/questions/5798936/inotifypropertychangear-or-otificycollectionchanged-with-datatable). Dies wird jedoch sehr ärgerlich sein, anstatt einfach ein Event wie DataGrid_CellEditEnding auszulösen und ändert nur die Farben code-weise (nur 3 Zeilen Code). Was sagst du? – ray