我对WPF比较陌生,所以我对Styles和setter有所了解,但是我遇到了麻烦。
我正在使用WPF数据网格,需要显示多个级别的分组。我希望第二和第三组级别比顶级更加缩进。
以下代码将显示组级别,但它会将它们一个显示在另一个上面,并使它们成为嵌套组级别无法分辨的事实。
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True">
<Expander.Header>
<TextBlock Text="{Binding Path=Name}"/>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander IsExpanded="True">
<Expander.Header>
<TextBlock Text="{Binding Path=Name}"/>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如何根据级别缩进组标题?
答案 0 :(得分:3)
如果有未来的人遇到这个问题。我能够嵌套组并设置样式,以便通过执行以下操作将它们堆叠在一起。
将属性添加到CollectionViewSource:
<Window.Resources>
<CollectionViewSource x:Key="cvs" Source="{Binding TestData}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="TopProperty"/>
<PropertyGroupDescription PropertyName="SubProperty"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
然后在DataGrid XAML中,您必须指定2个GroupStyles,第二个将用于嵌套组。我将边距添加到第二组的StackPanel中,将文本推向右侧,使其看起来像是在相应的列中。
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<Border Background="#FF959595" BorderBrush="#FF727272" BorderThickness="0,0,0,1" Margin="5,0,0,0">
<StackPanel Height="23" Orientation="Horizontal" Margin="3,0,0,0" Background="#FFE6E6E6">
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100" VerticalAlignment="Center"/>
</StackPanel>
</Border>
<ItemsPresenter />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel>
<Border Background="#FF959595" BorderBrush="#FF727272" BorderThickness="0,0,0,1" Margin="5,0,0,0">
<StackPanel Height="23" Orientation="Horizontal" Margin="3,0,0,0" Background="#FFF3F3F3">
<TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="55,0,0,0" Width="100" VerticalAlignment="Center"/>
</StackPanel>
</Border>
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</DataGrid.GroupStyle>
我能在这里找到更多信息: https://msdn.microsoft.com/en-us/library/ff407126%28v=vs.110%29.aspx
答案 1 :(得分:2)
我遇到了同样的问题,发现了一个不完美的解决方法。如果在ItemsPresenter的左侧添加边距,则每个级别都会缩减,如您所期望的那样。不幸的是,列标题不再与内容列对齐。我还在寻找解决方案......
答案 2 :(得分:1)
据我所知(或上次我检查过),WPF Datagrid不支持分层分组。
我能找到的最近的是this。
这就是我们在应用中使用Xceed DataGrid的原因。不幸的是,它不是免费的,所以可能不适合你。
答案 3 :(得分:1)
本教程朝着正确的方向发展:Multi Grouping in DataGrid 但遗憾的是'PagedCollectionView'是Silverlight。
答案 4 :(得分:0)
我已经使用ICollectionView和PropertyGroupDescription来添加分组,但是,您仍然必须使用XAML来描述分组的显示方式,否则您将无法获得分组的任何UI指示。
我对如何设置XAML感兴趣,以便我可以表示多个级别的分组,最好是每组级别或类似的某种缩进....