问题描述
我在 WPF 应用程序中有一个数据网格,其中我定义了一个 GroupStyle,如下所示:
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<Expander Header="{Binding Name}"
FontWeight="Bold"
FontSize="14"
Background="#FF5CB9EE">
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ItemCount,StringFormat=Student: {0}}" Margin="30,0" />
</StackPanel>
<ItemsPresenter/>
</StackPanel>
</Expander>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
datagrid 绑定到一个 CollectionViewSource,它的源是一个 ObservableCollection。在我的数据网格中,我有以下样式和 DataGridColumnTemplate:
<DataGrid.Resources>
<Style x:Key="GroupHeaderStyle" TargetType="DataGridColumnHeader">
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},Path=DataContext.GroupSortCommand}"/>
</Style>
</DataGrid.Resources>
<DataGridTemplateColumn Header="SchoolClass" HeaderStyle="{StaticResource GroupHeaderStyle}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding StudentEducational.ClassLabel}" HorizontalAlignment="Center" Margin="5"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
样式适用于“SchoolClass”列:通过单击它的标题,我会在我的视图模型中调用 GroupSortCommand。 现在一切正常。
问题:我希望实现以下行为:
- 如果您单击“SchoolClass”列的标题一次,则所有分组元素的扩展器都应折叠。
- 如果您再次单击标题,则所有分组元素的扩展器都应展开。
- 如果您第三次单击标题,则所有分组元素的扩展器都应折叠,除了所选元素(如果有)。在此状态下,您可以根据需要展开/折叠任何组。
我该如何解决这个问题?
请注意:我不会寻求实现逻辑本身的帮助(这是最简单的部分),而是关于如何设置所选组或所有组的 IsExpanded 属性。我知道这些组将位于某种列表(大概是 CollectionViewSource)中的某个位置,但是我如何利用它来发挥我的优势?
如果我在我的 ViewModel 中公开了一个 bool 类型的属性 IsGroupExpanded,我可以像这样将它应用到我的 XAML(这是来自 DataGrid ControlTemplate 的一个片段(见上面的代码)):
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<Expander Header="{Binding Name}" IsExpanded="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl},Path=DataContext.IsGroupExpanded}"
FontWeight="Bold" FontSize="14" Background="#FF5CB9EE" ExpandDirection="Down">
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ItemCount,StringFormat=Schüler: {0}}" Margin="30,0" />
</StackPanel>
<ItemsPresenter/>
</StackPanel>
</Expander>
</StackPanel>
</ControlTemplate>
我现在可以在我的 ViewModel 中设置“IsGroupExpanded”值(bool btw),以便所有组同时展开/折叠。
这样,我可以从我的列表中划掉我想要的三个行为中的两个。但是如何进入初始状态(每个组可以随意展开/折叠)?还是对待选中的组元素?
提前致谢 - 哦,大家新年快乐 ;-)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)