2016-06-27 11 views
1

Ich verwende ein DataGrid in WPF, um Werte anzuzeigen. Jetzt möchte ich grüne und rote Reihen haben. Ich habe es mit DataTrigger ausprobiert, aber nichts passiert.WPF DataGrid Set Style durch Bindung

Meine XAML:

<DataGrid x:Name="dgAbos" ItemsSource="{Binding Source=AboList}" HorizontalAlignment="Stretch" Margin="10,30,10,10" VerticalAlignment="Stretch" Height="Auto" Width="Auto"> 
     <DataGrid.Columns> 
       <DataGridTextColumn Header="ItemID" Binding="{Binding ItemID}" /> 
     </DataGrid.Columns> 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Active}" Value="false"> 
           <Setter Property="Background" Value="Red"></Setter> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding Active}" Value="true"> 
           <Setter Property="Background" Value="Green"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
     </DataGrid.RowStyle> 
</DataGrid> 

Der Bindungstyp ist:

ObservableCollection<OPCItem> AboList = new ObservableCollection<OPCItem>(); 

und das Element OPCItem anzuzeigen:

class OPCItem 
{ 
    public String ItemID { get; set; } 

    public String Name { get; set; } 

    public String Value { get; set; } 

    public DateTime DateTime { get; set; } 

    public String Group { get; set; } 

    private Boolean _Active; 

    public String Active 
    { 
     get 
     { 
      return (_Active == true ? "Aktiv" : "Inaktiv"); 
     } 
     set 
     { 
      _Active = Convert.ToBoolean(value); 
     } 
    } 
} 

Wie ich die Liste zu füllen:

AboList.Add(new OPCItem { ItemID = Item.ItemID, Group = GroupName, Active = "true" }); 

Aber die Zeile ändert nicht die Farbe, warum?

Antwort

3

Der Wert Ihrer Active Eigenschaft ist nie "true" noch "false", so dass die Trigger nie tatsächlich ausgelöst werden. Sie sollten die erwarteten Werte Ihrer Trigger ändern, um die Werte zu reflektieren, dass Active nehmen könnte (die "Aktiv" und "Inaktiv" sind):

<DataTrigger Binding="{Binding Active}" Value="Inaktiv"> 
    <Setter Property="Background" Value="Red"></Setter> 
</DataTrigger> 
<DataTrigger Binding="{Binding Active}" Value="Aktiv"> 
    <Setter Property="Background" Value="Green"></Setter> 
</DataTrigger> 
+0

omg ... Danke Mann, hat gut funktioniert;) – Phil795

2

Dies ist eine wirklich schlechte Idee:

So setzen Sie Active zu "wahr" oder "falsch", und du bekommst "Aktiv" oder "Inaktiv" zurück? Das natürliche Ergebnis davon ist, dass Sie sich mit dem Punkt verwechseln, an dem Sie einen Trigger schreiben, vorausgesetzt, dass Active.get "true" oder "false" anstelle von "Activ" oder "Inaktiv" zurückgibt. Sie können das unmittelbare Problem beheben, indem Sie einfach die DataTrigger.Value Attribute wie Grx70 schlägt, aber es ist auf lange Sicht besser, das zugrunde liegende Problem zu beheben und schlechte Gewohnheiten wie diese zu vermeiden. Vor allem, wenn Sie vorhaben, in diesem Bereich zu arbeiten, wollen Sie wirklich nicht solche Sachen schreiben. Active sieht wie eine einfache Eigenschaft aus, aber das Verhalten ist nichts, was irgendjemand jemals erwarten würde, also wird jeder, der damit interagiert, überrascht sein, und dann müssen sie den Code lesen, um herauszufinden, was es tut. Denken Sie einmal so darüber nach: Wenn Sie eine Eigenschaft in einem WPF-Steuerelement namens IsEnabled sehen, wissen Sie genau, was es bedeutet, wie Sie es verwenden und um welchen Typ es sich handelt. Es macht dein Leben leichter.

Also statt, empfehle ich Ihnen Ihre boolean Eigenschaft eine tatsächliche boolean machen:

private bool _isActive; 
public bool IsActive { 
    get { return _isActive; } 
    set { _isActive = value; } 
} 

XAML:

<Style.Triggers> 
    <DataTrigger Binding="{Binding IsActive}" Value="false"> 
     <Setter Property="Background" Value="Red"></Setter> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding IsActive}" Value="true"> 
     <Setter Property="Background" Value="Green"></Setter> 
    </DataTrigger> 
</Style.Triggers> 

Wenn Sie wan die Saiten "Aktiv" und "Inaktiv" irgendwo angezeigt werden in die UI, können Sie das mit einem anderen Auslöser oder mit einer readonly Eigenschaft wie etwas wie ActiveDisplayString tun.

Sie sollten INotifyPropertyChanged wahrscheinlich auch in dieser OPCItem Klasse implementieren; Auf diese Weise können Sie die Eigenschaftswerte ändern, nachdem sie sich im Raster befinden, und die Benutzeroberfläche spiegelt die Änderungen wider.