5

Ich möchte einen Weg finden, die Hintergrundfarbe von Zeilen eines DataGrid an eine Eigenschaft meiner gebundenen Objekte zu binden.Silverlight DataGrid-Zeilenfarbbindung

Hier ist meine XAML:

<sdk:DataGrid ItemsSource="{Binding MyItems}" /> 

ich das MVVM Light Toolkit mit Silverlight verwenden 4.

Antwort

8

Sie können es tun, indem Sie eine Zeilenvorlage zu ändern:

<sdk:DataGrid ItemsSource="{Binding MyItems}"> 
    <sdk:DataGrid.RowStyle> 
     <Style TargetType="sdk:DataGridRow"> 
      <Setter Property="Template"> 
      ... 
       <Rectangle x:Name="BackgroundRectangle" Fill="{Binding ColorPropertyOfItem}" /> 
      ... 
      </Setter> 
     </Style> 
    </sdk:DataGrid.RowStyle> 
</sdk:DataGrid> 

Or Sie können jede Spalte als TemplateColumn markieren und die Hintergrundfarbe in jedem davon explizit festlegen:

<sdk:DataGridTemplateColumn Header="ColumnName" SortMemberPath="ColumnProperty"> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding ColumnProperty}" Background="{Binding ColorPropertyOfItem}" /> 
     </DataTemplate> 
    </sdk:DataGridTemplateColumn.CellTemplate> 
</sdk:DataGridTemplateColumn> 

Dies ist die komplette Vorlage der DataGridRow Klasse:

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="local:DataGridRow" 
      xmlns:localprimitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data" 
      xmlns:local="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
      xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"> 
      <localprimitives:DataGridFrozenGrid Name="Root"> 
       <vsm:VisualStateManager.VisualStateGroups> 
        <vsm:VisualStateGroup x:Name="CommonStates"> 
         <vsm:VisualState x:Name="Normal"/> 
        <vsm:VisualState x:Name="NormalAlternatingRow"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="0"/> 
          </Storyboard> 
         </vsm:VisualState> 
         <vsm:VisualState x:Name="MouseOver"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To=".5"/> 
          </Storyboard> 
         </vsm:VisualState> 
         <vsm:VisualState x:Name="NormalSelected"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
          </Storyboard> 
         </vsm:VisualState> 
         <vsm:VisualState x:Name="MouseOverSelected"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
          </Storyboard> 
         </vsm:VisualState> 
         <vsm:VisualState x:Name="UnfocusedSelected"> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
           <ColorAnimation Duration="0" Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="(Fill).Color" To="#FFE1E7EC"/> 
          </Storyboard> 
         </vsm:VisualState> 
        </vsm:VisualStateGroup> 
        <vsm:VisualStateGroup x:Name="ValidationStates"> 
         <vsm:VisualState x:Name="Valid"/> 
         <vsm:VisualState x:Name="Invalid"> 
          <Storyboard> 
           <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="BackgroundRectangle" Storyboard.TargetProperty="Visibility"> 
            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/> 
           </ObjectAnimationUsingKeyFrames> 
           <DoubleAnimation Storyboard.TargetName="InvalidVisualElement" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/> 
          </Storyboard> 
         </vsm:VisualState> 
        </vsm:VisualStateGroup> 
       </vsm:VisualStateManager.VisualStateGroups> 
       <Grid.RowDefinitions> 
        <RowDefinition/> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="Auto"/> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 

       <Grid.Resources> 
        <Storyboard x:Key="DetailsVisibleTransition"> 
         <DoubleAnimation Storyboard.TargetName="DetailsPresenter" Storyboard.TargetProperty="ContentHeight" Duration="00:00:0.1" /> 
        </Storyboard> 
       </Grid.Resources> 

       <Rectangle x:Name="BackgroundRectangle" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="{Binding ColorPropertyOfItem}"/> 
       <Rectangle x:Name="InvalidVisualElement" Grid.RowSpan="2" Grid.ColumnSpan="2" Opacity="0" Fill="#FFF7D8DB"/> 

       <localprimitives:DataGridRowHeader Grid.RowSpan="3" Name="RowHeader" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> 
       <localprimitives:DataGridCellsPresenter Grid.Column="1" Name="CellsPresenter" localprimitives:DataGridFrozenGrid.IsFrozen="True" /> 
       <localprimitives:DataGridDetailsPresenter Grid.Row="1" Grid.Column="1" Name="DetailsPresenter" /> 
       <Rectangle Grid.Row="2" Grid.Column="1" Name="BottomGridLine" HorizontalAlignment="Stretch" Height="1" /> 
      </localprimitives:DataGridFrozenGrid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

Und vergessen Sie nicht Binding ColorPropertyOfItem zu einer realen Eigenschaft des Typs Brush in Ihrem Modell zu ändern.

+0

Danke für die Antwort, habe ich die erste Lösung verwendet, da mein DataGrid viele Spalten haben wird und jedes Mal eine TemplateColumn erstellen würde, wäre zu ausführlich). –

+0

Hallo! Ich bin nicht vertraut mit Templating. Können Sie mir bitte zeigen, welcher Wert an Stelle von '...' in Ihrer Antwort benötigt wird? Vielen Dank ! – Shimrod

+0

@Shimrod Ich habe meine Antwort bearbeitet und am Ende eine Standardvorlage hinzugefügt. – vorrtex