2013-08-05 24 views
51

Trong mã XAML, tôi muốn đặt màu Background của mỗi hàng, dựa trên giá trị của đối tượng trong một hàng cụ thể. Tôi có một số ObservableCollection của z và mỗi một trong số z có một thuộc tính được gọi là State. Tôi bắt đầu với một cái gì đó như thế này trong DataGrid tôi:Cách thiết lập hàng nền của DataGrid, dựa trên giá trị thuộc tính sử dụng kết buộc dữ liệu

<DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
     <Setter Property="Background" 
       Value="{Binding z.StateId, Converter={StaticResource StateIdToColorConverter}}"/> 
    </Style> 
</DataGrid.RowStyle> 

Đây là một cách tiếp cận sai vì x không phải là một tài sản trong lớp ViewModel của tôi.

Trong lớp ViewModel của tôi Tôi có một ObservableCollection<z>ItemsSource của DataGrid này, và một SelectedItem loại z.

Tôi có thể liên kết màu với SelectedItem, nhưng điều này sẽ chỉ thay đổi một hàng trong số DataGrid.

Làm cách nào để tôi có thể dựa trên một thuộc tính thay đổi màu nền của hàng này?

Trả lời

114

Sử dụng DataTrigger

<DataGrid ItemsSource="{Binding YourItemsSource}"> 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding State}" Value="State1"> 
         <Setter Property="Background" Value="Red"></Setter> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding State}" Value="State2"> 
         <Setter Property="Background" Value="Green"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGrid.RowStyle> 
    </DataGrid> 
+2

tôi chỉ nhận được: BindingExpression lỗi đường dẫn: ' Không tìm thấy thuộc tính 'State' trên 'object' '' z '(HashCode = 7162954)'. BindingExpression: Đường dẫn = Tiểu bang; DataItem = 'z' (HashCode = 7162954); phần tử đích là 'DataGridRow' (Tên = ''); target property là 'NoTarget' (gõ 'Object') 'Howcome rằng nó không tìm thấy bất động sản Nhà nước khi thực thể của tôi giữ điều này, và cơ sở dữ liệu của tôi cho thấy Nhà nước như là một cột? –

+2

Tôi hy vọng bạn không làm điều đó như 'z.State'. – Nitesh

+3

Chỉ cần đi qua này một lần nữa sau khi thời gian tắt từ wpf, ước gì tôi có thể upvote một lần nữa! – Ric

11

Cùng có thể được thực hiện mà không DataTrigger quá:

<DataGrid.RowStyle> 
         <Style TargetType="DataGridRow"> 
          <Setter Property="Background" > 
           <Setter.Value> 
            <Binding Path="State" Converter="{StaticResource BooleanToBrushConverter}"> 
             <Binding.ConverterParameter> 
              <x:Array Type="SolidColorBrush"> 
               <SolidColorBrush Color="{StaticResource RedColor}"/> 
               <SolidColorBrush Color="{StaticResource TransparentColor}"/> 
              </x:Array> 
             </Binding.ConverterParameter> 
            </Binding> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </DataGrid.RowStyle> 

đâu BooleanToBrushConverter là lớp sau:

public class BooleanToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) 
      return Brushes.Transparent; 

     Brush[] brushes = parameter as Brush[]; 
     if (brushes == null) 
      return Brushes.Transparent; 

     bool isTrue; 
     bool.TryParse(value.ToString(), out isTrue); 

     if (isTrue) 
     { 
      var brush = (SolidColorBrush)brushes[0]; 
      return brush ?? Brushes.Transparent; 
     } 
     else 
     { 
      var brush = (SolidColorBrush)brushes[1]; 
      return brush ?? Brushes.Transparent; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
Các vấn đề liên quan