2009-07-10 3 views
3

NB это было для бета-версии silverlight 3, RTM, похоже, обрабатывает группировку совершенно по-другому.Silverlight 3 BETA DataGrid group

Я сетка, работает отлично, который я использую GroupDescriptions свойство, как так:

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

Это работает блестяще, это только тогда, когда DataGrid оказывается, она показывает группировку по " Имя клиента". Очевидно, мне хотелось бы, чтобы это было «Имя клиента». Я не могу для жизни видеть вид собственности, которая позволила бы мне это установить?

ответ

8

FWIW это изменилось в SL3 RTM:

Silverlight 3 Бета

[Xaml]

<dataGrid.GroupDescriptions> 

     <windata:PropertyGroupDescription PropertyName=”State” /> 

</dataGrid.GroupDescriptions> 

Silverlight 3 RTM

[C#]

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

Вы, урожденная d, чтобы использовать класс PagedCollectionView для выполнения этого, он больше не может быть выполнен в Xaml. См http://msdn.microsoft.com/en-us/library/dd833072(VS.95).aspx

И от этой связи, вот как изменить текст в заголовке группы:

Когда элементы сгруппированы в DataGrid, каждая группа имеет заголовок. Вы можете изменить внешний вид DataGridRowGroupHeader, указав собственный стиль и добавив его в коллекцию RowGroupHeaderStyles. Если у вас несколько уровней группировки, вы можете применять разные стили к каждому групповому уровню. Стили применяются в том порядке, в котором они определены. Например, если вы определяете два стиля, первое будет применено к группам строк верхнего уровня. Второй стиль будет применен ко всем группам строк на втором уровне и ниже. DataContext DataGridRowGroupHeader представляет собой коллекцию CollectionViewGroup, которую представляет заголовок.

Так быстрый и грязный пример был бы:

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

На практике вы, вероятно, хотите, чтобы включать в себя другие части управления, которые указаны для DataGridRowGroupHeader, так что вы можете развернуть и свернуть их. Как и все WPF, вместо того, чтобы просто устанавливать свойство «GroupText», вам нужно пройти целых 9 ярдов!

+0

Что такое просмотр подкачки? Я попытался использовать свойство CollectionViewSource, и свойство GroupDescriptions не реализовано. – ChadT

+0

Извините за неполный ответ - обновил сообщение. –

3

Имея ту же проблему, что и DaRKoN_, и прочитав проницательный ответ Джеймса Кадда, я решил свою проблему. Используя Blend, я извлек шаблон для DataGridRowGroupHeader. Вы можете использовать код, приведенный ниже, чтобы настроить его:

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

Я добавил пустые строки до и после TextBlock, который содержит текст обижая.Вы можете полностью отключить его, используя следующий код XAML:

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

Если вы хотите изменить текст, который будет иметь как удалить имя TextBlock и добавьте Text атрибут:

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

DataGridRowGroupHeader будет искать TextBlock с именем PropertyNameElement и установить текст из кода, и для избежания этого вам придется удалить имя из шаблона.

0

Я реализовал шаблон, любезно предоставленный Martin Liversage (спасибо!), Но я не могу контролировать высоту строки данных группы. Регулировка размера прямоугольников и т. Д. Просто занимает больше места в ряду, скрывая другие части. Кажется, что высота строки контролируется контейнером для строки, вне влияния шаблона. TIA Toby

Найден ответ!
См http://msdn.microsoft.com/en-us/library/cc278075(VS.95).aspx
Это определяет все стили управления и шаблоны и масштабирование в DataGrid и просмотр шаблона по умолчанию вы найдете:

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

Установки свойства Height делает работу.

+0

Я все еще хочу знать, как извлечь шаблон, используя Blend ... – 2009-12-21 15:46:37

+0

Я потратил около 5 минут, пытаясь понять, как получить шаблон по умолчанию с помощью Blend, затем я только что открыл Reflector и извлек generic.xaml из ресурсов сборки. Microsoft действительно должна придумать лучшее решение для этого, куча daft pri ... – Rory

0

Установить имя свойства атрибута Display применяется к свойству вы группирование по:

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

глядя на классе Display, можно было бы подумать GroupName бы свойство установить, но, увы него не.

Я понимаю, что «мутная» модель с отображаемыми данными не всегда, как все (включая меня) любят делать что-то ... но в отличие от объема работы, требуемой для этого в вышеуказанных способах. I думаю, что он выиграет на этот раз.

Смежные вопросы