代码之家  ›  专栏  ›  技术社区  ›  ChadT

Silverlight 3 Beta数据报分组

  •  3
  • ChadT  · 技术社区  · 16 年前

    注意,这是针对Silverlight3测试版的,RTM似乎处理分组的方式完全不同。

    我有一个运行良好的网格,我使用的GroupDescriptions属性如下:

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

    这很好地工作,只有在呈现数据报时,它才会显示“clientname”的分组。很明显,我希望这是“客户名称”。我一辈子都看不到一个能让我设置这个的财产?

    4 回复  |  直到 14 年前
        1
  •  8
  •   Mark Pim    16 年前

    fwiw这在sl3 rtm中发生了变化:

    Silverlight 3测试版

    [厦门]

    <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

    从这个链接,下面是如何更改组标题中的文本:

    当项在数据报中分组时,每个组都有一个头。通过定义自定义样式并将其添加到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码!

        2
  •  3
  •   Martin Liversage    16 年前

    我和达康有着同样的问题,读过詹姆斯·卡德富有洞察力的答案后,我解决了自己的问题。通过使用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>
    

    如果您要修改文本,您将同时删除 控件 添加一个 Text 属性:

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

    这个 DataGridRowGroupHeader 将寻找一个 控件 命名 PropertyNameElement 并从代码中设置文本,为了避免这种情况发生,您必须从模板中删除名称。

        3
  •  0
  •   Tobi    16 年前

    我已经很好地实现了Martin Liversage提供的模板(谢谢!)但我似乎无法控制组数据行的高度。调整矩形等的大小只会占用行中更多的空间,隐藏其他部分。行高似乎是由行的容器控制的,不受模板的影响。 蒂亚 托比

    找到答案了!
    参照 http://msdn.microsoft.com/en-us/library/cc278075(VS.95).aspx
    这将定义所有控件样式和模板,并放大数据报并查看将找到的默认模板:

    <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属性可以完成此项工作。

        4
  •  0
  •   JoeBrockhaus ozkary    14 年前

    设置应用于要分组的属性的显示属性的名称属性:

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

    查看display类,可能会认为groupname是您设置的属性,但遗憾的是它不是。

    我理解用显示数据“搞混”模型并不总是每个人(包括我自己)都喜欢做的事情。但与上述方法所需的工作量相比……我想这次胜出了。