2012-12-17 38 views
8

Làm cách nào để tạo RowStyle của tôi để được áp dụng sau AlternatingRowBackground? Tôi muốn các mặt hàng, có IsOrangetrue để có nền Orange bất kể nền hàng xen kẽ, hiện không phải là trường hợp nào.WPF DataGrid AlternatingRowBackground và RowStyle ưu tiên

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

Vị trí thuộc tính IsOrange, nằm ngay trên cửa sổ ngữ cảnh ?? – MoHaKa

+0

Tôi có một chế độ xem mô hình SomethingWhichCanBeOrangeViewModel có thuộc tính IsRange boolean. Lưới của tôi có ItemsSource được đặt thành ObservableCollection . – user1514042

+0

Được rồi, vì vậy bạn chắc chắn rằng tài sản của bạn có thể truy cập trong DataGrid của bạn. – MoHaKa

Trả lời

12

Đó không phải là lỗi. Trong một Style bạn không thể ghi đè lên một giá trị địa phương được đặt cho hàng xen kẽ. Đó là lý do tại sao điều này sẽ không làm việc

<DataGrid AlternatingRowBackground="Blue" 

Nhưng nếu bạn thiết lập AlternatingRowBackground trong một Style bạn có thể

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

Nhờ this answer.

+0

Loại đồng ý, nhưng đó là truy cập trực quan mà hàng xen kẽ được áp dụng sau khi phong cách. – user1514042

+0

Cảm ơn! Đây chính là giải pháp tôi đang tìm kiếm. –

2

Trong chương trình của tôi, tôi có hai lớp ngoài cửa sổ chính chỉ chứa một DataGird. Hãy bắt đầu với lớp học đầu tiên:

MyClass.cs:

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

    public string Name { get; set; } 
} 

Tôi chỉ có hai thuộc tính, IsOrange xác định xem hàng nên cam. ((Không quan tâm đến tài sản khác.))

Bây giờ lớp mô hình chế độ xem chỉ chứa bộ sưu tập 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" }); 
    } 
} 

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

cuối cùng trong MainWindow.xaml.cs:

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

    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = VM; 
    } 
} 

và đây là kết quả:

enter image description here

bạn có thể gửi cho tôi email của bạn để gửi cho bạn ứng dụng.

Chúc may mắn :)