2009-07-10 12 views
3

NB das war für die Silverlight 3 Beta, RTM scheint die Gruppierung völlig anders zu handhaben.Silverlight 3 BETA DataGrid-Gruppierung

Ich habe ein Raster, das funktioniert prima, die ich wie so die Groupdescriptions Eigenschaft bin mit:

<data:DataGrid.GroupDescriptions> 
    <cm:PropertyGroupDescription PropertyName="ClientName" /> 
</data:DataGrid.GroupDescriptions> 

Dies funktioniert hervorragend, es ist nur, wenn das Datenraster wiedergegeben wird, zeigt es die Gruppierung durch " Kundenname". Offensichtlich möchte ich das "Kundenname" sein. Ich kann nicht für das Leben von mir eine Eigenschaft sehen, die mir erlauben würde, das zu setzen?

Antwort

8

FWIW dies in SL3 RTM geändert hat:

Silverlight 3 Beta

[XAML]

<dataGrid.GroupDescriptions> 

     <windata:PropertyGroupDescription PropertyName=”State” /> 

</dataGrid.GroupDescriptions> 

Silverlight 3 RTM

[C#]

pagedCollectionView.GroupDescriptions.Add(new PropertyGroupDescription(“State”)); 

Du brauchst Um die PagedCollectionView-Klasse zu verwenden, ist dies in Xaml nicht mehr möglich. Siehe http://msdn.microsoft.com/en-us/library/dd833072(VS.95).aspx

Und von diesem Link hier, wie Sie den Text im Gruppenkopf ändern:

Wenn Elemente im Datagrid gruppiert sind, wobei jede Gruppe einen Header hat. Sie können die Darstellung von DataGridRowGroupHeader ändern, indem Sie einen benutzerdefinierten Stil definieren und ihn der RowGroupHeaderStyles-Auflistung hinzufügen. Wenn Sie mehrere Gruppierungsebenen haben, können Sie auf jeder Gruppenebene verschiedene Stile anwenden. Stile werden in der Reihenfolge angewendet, in der sie definiert sind. Wenn Sie beispielsweise zwei Stile definieren, wird der erste auf Zeilengruppen der obersten Ebene angewendet. Der zweite Stil wird auf alle Zeilengruppen auf der zweiten Ebene und darunter angewendet. Der DataContext des DataGridRowGroupHeader ist die CollectionViewGroup, die der Header darstellt.

So ein quick and dirty Beispiel wäre:

<dataControls:DataGrid x:Name="Grid"> 
    <dataControls:DataGrid.RowGroupHeaderStyles> 
     <Style TargetType="dataControls:DataGridRowGroupHeader"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <TextBlock Text="My text."/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </dataControls:DataGrid.RowGroupHeaderStyles> 
</dataControls:DataGrid> 

In der Praxis möchten Sie wahrscheinlich die anderen Steuerteile enthalten, die für DataGridRowGroupHeader angegeben sind, so dass Sie und sie kollabieren erweitern. Wie bei allem WPF müssen Sie nicht nur eine "GroupText" -Eigenschaft setzen, sondern ganze 9 Yards!

+0

Wie lautet die Auslagerungsansicht? Ich habe versucht, die CollectionViewSource und die GroupDescriptions-Eigenschaft ist nicht implementiert. – ChadT

+0

Sorry für die unvollständige Antwort - aktualisiert den Beitrag. –

3

Mit dem gleichen Problem wie DaRKoN_ und James Cadd aufschlussreiche Antwort gelesen habe ich mein eigenes Problem gelöst. Mit Blend habe ich die Vorlage für die DataGridRowGroupHeader extrahiert. Sie können den Code verwenden, darunter anzupassen:

<data:DataGrid> 
    <data:DataGrid.RowGroupHeaderStyles> 
    <Style TargetType="data:DataGridRowGroupHeader"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="data:DataGridRowGroupHeader"> 
      <dataPrimitives:DataGridFrozenGrid x:Name="Root" Background="{TemplateBinding Background}"> 
       <dataPrimitives:DataGridFrozenGrid.Resources> 
       <ControlTemplate x:Key="ToggleButtonTemplate" TargetType="ToggleButton"> 
        <Grid Background="Transparent"> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
         <VisualState x:Name="Normal"/> 
         <VisualState x:Name="MouseOver"> 
          <Storyboard> 
          <ColorAnimation Duration="0" Storyboard.TargetName="CollapsedArrow" Storyboard.TargetProperty="(Stroke).Color" To="#FF6DBDD1"/> 
          <ColorAnimation Duration="0" Storyboard.TargetName="ExpandedArrow" Storyboard.TargetProperty="(Fill).Color" To="#FF6DBDD1"/> 
          </Storyboard> 
         </VisualState> 
         <VisualState x:Name="Pressed"> 
          <Storyboard> 
          <ColorAnimation Duration="0" Storyboard.TargetName="CollapsedArrow" Storyboard.TargetProperty="(Stroke).Color" To="#FF6DBDD1"/> 
          <ColorAnimation Duration="0" Storyboard.TargetName="ExpandedArrow" Storyboard.TargetProperty="(Fill).Color" To="#FF6DBDD1"/> 
          </Storyboard> 
         </VisualState> 
         <VisualState x:Name="Disabled"> 
          <Storyboard> 
          <DoubleAnimation Duration="0" Storyboard.TargetName="CollapsedArrow" Storyboard.TargetProperty="Opacity" To=".5"/> 
          <DoubleAnimation Duration="0" Storyboard.TargetName="ExpandedArrow" Storyboard.TargetProperty="Opacity" To=".5"/> 
          </Storyboard> 
         </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="CheckStates"> 
         <VisualState x:Name="Checked"/> 
         <VisualState x:Name="Unchecked"> 
          <Storyboard> 
          <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="CollapsedArrow" Storyboard.TargetProperty="Visibility"> 
           <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/> 
          </ObjectAnimationUsingKeyFrames> 
          <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="ExpandedArrow" Storyboard.TargetProperty="Visibility"> 
           <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/> 
          </ObjectAnimationUsingKeyFrames> 
          </Storyboard> 
         </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <Path x:Name="CollapsedArrow" Stretch="Uniform" Stroke="#FF414345" HorizontalAlignment="Center" VerticalAlignment="Center" Width="5" Visibility="Collapsed" Data="F1 M 0,0 L 0,1 L .6,.5 L 0,0 Z"/> 
        <Path x:Name="ExpandedArrow" Fill="#FF414345" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" Width="6" Data="F1 M 0,1 L 1,1 L 1,0 L 0,1 Z"/> 
        </Grid> 
       </ControlTemplate> 
       </dataPrimitives:DataGridFrozenGrid.Resources> 
       <dataPrimitives:DataGridFrozenGrid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition/> 
       </dataPrimitives:DataGridFrozenGrid.ColumnDefinitions> 
       <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup x:Name="CurrentStates"> 
        <VisualState x:Name="Regular"/> 
        <VisualState x:Name="Current"> 
        <Storyboard> 
         <DoubleAnimation Duration="0" Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="Opacity" To="1"/> 
        </Storyboard> 
        </VisualState> 
       </VisualStateGroup> 
       </VisualStateManager.VisualStateGroups> 
       <dataPrimitives:DataGridFrozenGrid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition/> 
       <RowDefinition Height="Auto"/> 
       </dataPrimitives:DataGridFrozenGrid.RowDefinitions> 
       <Rectangle Fill="#FFFFFFFF" Height="1" Grid.Column="1" Grid.ColumnSpan="5"/> 
       <Rectangle x:Name="IndentSpacer" Grid.Column="1" Grid.Row="1"/> 
       <ToggleButton x:Name="ExpanderButton" Height="15" Margin="2,0,0,0" Width="15" Template="{StaticResource ToggleButtonTemplate}" Grid.Column="2" Grid.Row="1"/> 
       <StackPanel Margin="0,1,0,1" VerticalAlignment="Center" Grid.Column="3" Grid.Row="1" Orientation="Horizontal"> 

       <TextBlock x:Name="PropertyNameElement" Margin="4,0,0,0" Visibility="{TemplateBinding PropertyNameVisibility}"/> 

       <TextBlock Margin="4,0,0,0" Text="{Binding Name}"/> 
       <TextBlock x:Name="ItemCountElement" Margin="4,0,0,0" Visibility="{TemplateBinding ItemCountVisibility}"/> 
       </StackPanel> 
       <Rectangle Fill="#FFD3D3D3" Height="1" Grid.Column="1" Grid.ColumnSpan="5" Grid.Row="2"/> 
       <Rectangle x:Name="FocusVisual" Stroke="#FF6DBDD1" StrokeThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" Grid.Column="1" Grid.ColumnSpan="4" Grid.RowSpan="3"/> 
       <dataPrimitives:DataGridRowHeader x:Name="RowHeader" Grid.RowSpan="3" dataPrimitives:DataGridFrozenGrid.IsFrozen="True"/> 
      </dataPrimitives:DataGridFrozenGrid> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </data:DataGrid.RowGroupHeaderStyles> 
</data:DataGrid> 

ich leere Zeilen hinzugefügt haben, vor und nach dem TextBlock, die den problematischen Text enthält.Sie können ihn vollständig deaktivieren, indem Sie den folgenden XAML:

<data:DataGrid> 
    <data:DataGrid.RowGroupHeaderStyles> 
    <Style TargetType="data:DataGridRowGroupHeader"> 
     <Setter Property="PropertyNameVisibility" Value="Collapsed"/> 
    </Style> 
    <data:DataGrid.RowGroupHeaderStyles> 
</data:DataGrid> 

Wenn Sie den Text ändern möchten, müssen Sie sowohl den Namen des TextBlock entfernen und fügen Sie ein Text Attribut:

<TextBlock Margin="4,0,0,0" Visibility="{TemplateBinding PropertyNameVisibility}" Text="Client Name:"/> 

Die DataGridRowGroupHeader wird nach einem TextBlock mit dem Namen PropertyNameElement suchen und den Text aus dem Code setzen, und um dies zu vermeiden, müssen Sie den Namen aus der Vorlage entfernen.

0

Ich habe die Vorlage von Martin Liversage freundlicherweise zur Verfügung gestellt (danke!), Aber ich kann nicht scheinen, die Höhe der Gruppendatenzeile zu kontrollieren. Das Anpassen der Größe der Rechtecke usw. nimmt nur mehr Platz in der Reihe ein und versteckt andere Teile. Es scheint, dass die Zeilenhöhe durch den Container für die Zeile außerhalb des Einflusses der Vorlage gesteuert wird. TIA Toby

Die Antwort gefunden!
Siehe http://msdn.microsoft.com/en-us/library/cc278075(VS.95).aspx
Dies alles wird die Steuer Styles und Templates und Zoomen in das Datagrid und Anzeigen der Standardvorlage definiert Sie finden:

<data:DataGrid.RowGroupHeaderStyles> 
<Style TargetType="local:DataGridRowGroupHeader"> 
<Setter Property="Cursor" Value="Arrow" /> 
<Setter Property="IsTabStop" Value="False" /> 
<Setter Property="Background" Value="#FFE4E8EA" /> 
<Setter Property="Height" Value="20"/> 
<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="local:DataGridRowGroupHeader"> 
    ...snip... 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 
</data:DataGrid.RowGroupHeaderStyles> 

die Height-Eigenschaft Einstellung macht den Job.

+0

Ich möchte immer noch wissen, wie man die Vorlage mit Blend ... –

+0

Ich verbrachte etwa 5 Minuten zu versuchen, herauszufinden, wie die Standardvorlage mit Blend, dann habe ich nur Reflektor und extrahierte generic.xaml aus den Ressourcen der Versammlung. Microsoft muss wirklich eine bessere Lösung für dieses, Haufen dämlicher Pri ... – Rory

0

die Eigenschaft Name des Display-Attribut auf das Objekt angewendet Sie Gruppierung von:

[System.ComponentModel.DataAnnotations.Display(Name = "My Property")] 
public string MyProperty {get;set;} 

an der Display-Klasse sucht, könnte man denken, Gruppenname die Eigenschaft, die Sie gesetzt sein würde, aber leider es es nicht.

Ich verstehe "matschig up" das Modell mit Display-Daten ist nicht immer, wie jeder (mir selbst) mag Dinge zu tun .. aber im Gegensatz zu der Menge an Arbeit erforderlich, um es in den oben genannten Möglichkeiten tun .. Ich denke, es gewinnt dieses Mal.