2012-12-17 4 views
8

Come attivare l'applicazione RowStyle dopo AlternatingRowBackground? Voglio gli articoli, con come per avere lo sfondo Orange indipendentemente dallo sfondo di riga alternata, che non è il caso attualmente.WPF DataGrid AlternatingRowBackground e RowStyle precedenza

XAML:

<DataGrid Name="g" 
    AlternatingRowBackground="Blue" 
    AlternationCount="2" 
    ... 
    SelectionMode="Single"> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsOrange}" Value="Y"> 
        <Setter Property="Background" Value="Orange" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
    ... 
</DataGrid> 
+0

Dove si trova la proprietà IsOrange, si trova direttamente sul contesto della finestra ?? – MoHaKa

+0

Ho un modello di vista SomethingWhichCanBeOrangeViewModel con proprietà IsRange booleane. La mia griglia ha il suo Set di risorse impostato su ObservableCollection . – user1514042

+0

Ok, quindi sei sicuro che la tua proprietà sia accessibile nel tuo DataGrid. – MoHaKa

risposta

12

Non è un bug. In un Style non è possibile sovrascrivere un set di valori locale per la riga alternata. Ecco perché questo non funzionerà

<DataGrid AlternatingRowBackground="Blue" 

Ma se si imposta AlternatingRowBackground in un Style si può

<DataGrid.Style> 
    <Style TargetType="DataGrid"> 
     <Setter Property="AlternatingRowBackground" Value="Blue"/> 
    </Style> 
</DataGrid.Style> 

Grazie a this answer.

+0

Sono d'accordo, ma è contro intuitivo che l'alternanza di righe bg viene applicata dopo lo stile. – user1514042

+0

Grazie! Questa era esattamente la soluzione che stavo cercando. –

2

Nel mio programma ho due classi oltre alla finestra principale che contiene solo un DataGird. Cominciamo con la prima classe:

MyClass.cs:

public class MyClass 
{ 
    public bool IsOrange { get; set; } 

    public string Name { get; set; } 
} 

ho solo due proprietà, IsOrange specifica se la riga dovrebbe essere arancione. ((Non preoccuparti per l'altra proprietà.))

Ora la classe del modello di vista contiene solo la raccolta di MyClass.

MyClassViewModel.cs:

public class MyClassViewModel 
{ 
    public ObservableCollection<MyClass> con { get; set; } 

    public MyClassViewModel() 
    { 
     con = new ObservableCollection<MyClass>(); 

     con.Add(new MyClass { IsOrange = true, Name = "Aa" }); 
     con.Add(new MyClass { IsOrange = true, Name = "Bb" }); 
     con.Add(new MyClass { IsOrange = false, Name = "Cc" }); 
     con.Add(new MyClass { IsOrange = false, Name = "Dd" }); 
     con.Add(new MyClass { IsOrange = false, Name = "Ee" }); 
     con.Add(new MyClass { IsOrange = true, Name = "Ff" }); 
     con.Add(new MyClass { IsOrange = true, Name = "Gg" }); 
     con.Add(new MyClass { IsOrange = false, Name = "Hh" }); 
    } 
} 

In MainWindow.xaml:

<Grid> 
    <DataGrid Margin="10" ItemsSource="{Binding Path=con}" > 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=IsOrange}" Value="true"> 
         <Setter Property="Background" Value="Orange" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGrid.RowStyle> 
    </DataGrid> 
</Grid> 

infine in MainWindow.xaml.cs:

public partial class MainWindow : Window 
{ 
    MyClassViewModel VM = new MyClassViewModel(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = VM; 
    } 
} 

e questo è il risultato:

enter image description here

mi puoi inviare la tua e-mail per inviare l'applicazione.

Buona fortuna :)