2013-08-05 13 views
51

W moim kodzie XAML, chcę ustawić kolor Background każdego wiersza, w oparciu o wartość obiektu w jednym określonym wierszu. Mam ObservableCollection z z, a każdy z z ma właściwość o nazwie State. Zacząłem się z czymś takim w moim DataGrid:Jak ustawić wiersz DataGrid Tło, na podstawie wartości właściwości za pomocą powiązań danych

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

Jest to błędne podejście, ponieważ x nie jest właściwością w klasie ViewModel.

W mojej klasie ViewModel Mam ObservableCollection<z> która jest ItemsSource tego DataGrid i SelectedItem typu z.

Mogę związać kolor z SelectedItem, ale zmieni to tylko jeden wiersz w DataGrid.

Jak mogę, na podstawie jednej właściwości zmienić ten kolor tła wierszy?

Odpowiedz

114

Zastosowanie 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

ja tylko dostać: error ścieżka BindingExpression: ' Właściwość "stan" nie została znaleziona w "obiekcie" "z" (HashCode = 7162954) ". BindingExpression: Path = State; DataItem = 'z' (HashCode = 7162954); elementem docelowym jest 'DataGridRow' (Name = ''); Właściwością target jest "NoTarget" (type "Object"). "Howcome that does not find the Property State, gdy moja jednostka to posiada, a moja baza danych pokazuje stan jako kolumnę? –

+2

Mam nadzieję, że nie robisz tego jako 'z.State'. – Nitesh

+3

Natknąłem się na to ponownie po czasie wolnym od wpf, żałuję, że nie mogłem ponownie zabrać głosu! – Ric

11

samo można zrobić bez DataTrigger też:

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

Gdzie BooleanToBrushConverter jest następujące klasy:

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(); 
    } 
} 
Powiązane problemy