3

注意这是针对silverlight 3 beta 的,RTM 处理分组的方式似乎完全不同。

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

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

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

4

4 回答 4

8

FWIW 这在 SL3 RTM 中发生了变化:

Silverlight 3 测试版

[Xaml]

<dataGrid.GroupDescriptions>

      <windata:PropertyGroupDescription PropertyName=”State” />

</dataGrid.GroupDescriptions>

银光 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 是 header 所代表的 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 码!

于 2009-07-10T14:36:30.367 回答
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命名PropertyNameElement并设置文本,为避免这种情况发生,您必须从模板中删除名称。

于 2009-08-27T16:02:43.197 回答
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>  

设置 Height 属性可以完成这项工作。

于 2009-12-20T22:47:08.060 回答
0

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

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

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

我知道用显示数据“混淆”模型并不总是每个人(包括我自己)都喜欢做事..但与以上述方式完成所需的工作量相反..我认为它会胜出这次。

于 2011-11-07T16:16:36.133 回答