Silverlight 3 BETA DataGrid分组

时间:2009-07-10 05:26:15

标签: silverlight silverlight-3.0 datagrid

NB这是针对silverlight 3测试版,RTM似乎完全不同地处理分组。

我有一个工作正常的网格,我正在使用GroupDescriptions属性:

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

这非常有效,只有在渲染数据网格时,它才会显示“ClientName”的分组。显然,我希望它是“客户名称”。我不能为我的生活看到一个允许我设置它的属性吗?

4 个答案:

答案 0 :(得分:8)

FWIW在SL3 RTM中发生了变化:

Silverlight 3 Beta

[XAML中]

<dataGrid.GroupDescriptions>

      <windata:PropertyGroupDescription PropertyName=”State” />

</dataGrid.GroupDescriptions>

Silverlight 3 RTM

并[c#]

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

您需要使用PagedCollectionView类来完成此任务,不能再在Xaml中完成。见http://msdn.microsoft.com/en-us/library/dd833072(VS.95).aspx

从该链接开始,以下是如何更改组标题中的文字:

当项目在DataGrid中分组时,每个组都有一个标题。您可以通过定义自定义样式并将其添加到RowGroupHeaderStyles集合来更改DataGridRowGroupHeader的外观。如果您有多个级别的分组,则可以为每个组级别应用不同的样式。样式按照定义的顺序应用。例如,如果您定义了两个样式,则第一个样式将应用于顶级行组。第二种样式将应用于第二级和更低级别的所有行组。 DataGridRowGroupHeader的DataContext是标题所代表的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码!

答案 1 :(得分:3)

与DaRKoN_有同样的问题,并且阅读了James Cadd有见识的答案,我解决了自己的问题。通过使用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的{​​{1}}并从代码中设置文本,为避免发生这种情况,您必须从模板中删除该名称。

答案 2 :(得分:0)

我已经实现了Martin Liversage慷慨提供的模板(谢谢!)但我似乎无法控制组数据行的高度。调整矩形等的大小只占用了更多的空间,隐藏了其他部分。在模板的影响之外,行的容器似乎正在控制行高。 TIA 托比

找到答案!
请参阅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>  

设置高度属性可以完成工作。

答案 3 :(得分:0)

设置应用于您要分组的属性的Display属性的Name属性:

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

查看Display类,可能会认为GroupName将是您设置的属性,但不是它。

我理解“混淆”带有显示数据的模型并不总是每个人(包括我自己)喜欢做的事情......但与上述方式所需的工作量相反...我认为它赢了这次。