2009-07-10 63 views
3

注意这是Silverlight 3测试版,RTM似乎完全不同。Silverlight 3 BETA DataGrid分组

我有一个网格,是工作的罚款,我使用的是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进行分组,每个组有一个头。您可以通过定义自定义样式并将其添加到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码!

+0

什么是分页收集视图?我尝试使用CollectionViewSource并且GroupDescriptions属性未实现。 – ChadT 2009-07-16 07:09:59

+0

对不完整的答案 - 更新了帖子。 – 2009-07-16 14:02:53

3

与DaRKoN_有同样的问题,并阅读James Cadd富有洞察力的答案我解决了我自己的问题。通过使用混合我已经提取了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将寻找名为PropertyNameElementTextBlock并设置代码中的文本,为避免发生这种情况,您必须从模板中删除名称。

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。微软真的必须为此提出一个更好的解决方案,一堆愚蠢的pri ... – Rory 2010-02-05 20:06:17

0

设置应用到属性的显示属性的名称属性你通过分组:

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

看显示器类,可能会觉得组名是您设置的属性,但可惜它它不。

我明白'模糊'显示数据的模型并不总是如何每个人(包括我自己)都喜欢做事情......但与上述方式所需的工作量相反......我认为这次赢了。