【问题标题】:WPF Grouping a DataGrid nested in databound tabsWPF对嵌套在数据绑定选项卡中的DataGrid进行分组
【发布时间】:2010-10-25 22:27:04
【问题描述】:

我需要对嵌套在TabControl 中的DataGrid 中的行应用分组。 DataGridTabControl 都是数据绑定的。最外层的控件绑定到一个 ViewModel,它公开了绑定到 TabControl 的页面集合。每个页面都公开了一组绑定到Grid 的行。

我尝试遵循this one from SOthis one from C-SharpCorner 之类的模式。我没有嫁给这些,所以如果有更好的模式(as this post seems to indicate),我愿意朝另一个方向发展。

目前,我不确定在哪里注入PropertyGroupDescription 的定义并将其绑定到我想要的PropertyName。我尝试将其作为资源并直接作为DataGrid 上的CollectionViewSource。但两者都没有产生合理的结果。

这是我目前所拥有的:

<UserControl x:Class="View.ViewInvoiceUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" >
<Grid Name="_grid" MinHeight="100">

为清晰起见截取...

<TabControl 
    ItemsSource="{Binding Path=CurrentInvoice.InvoicePages}" 
    Grid.Column="0" 
    Grid.ColumnSpan="4" 
    Grid.Row="5" 
    HorizontalAlignment="Left" 
    Margin="0,4,0,0" 
    Name="_invoicePageTabControl" 
    VerticalAlignment="Top">
    <TabControl.ItemContainerStyle />
        <TabControl.ContentTemplate>
            <DataTemplate>
                <DataGrid 
                    Name="_invoiceLineGrid" 
                    AutoGenerateColumns="False" 
                    CanUserSortColumns="True"
                    ColumnHeaderStyle="{StaticResource columnHeaderStyle}"
                    HorizontalAlignment="Left" 
                    ItemsSource="{Binding InvoiceLines}" 
                    IsReadOnly="True"
                    RowDetailsVisibilityMode="VisibleWhenSelected"
                    RowStyle="{StaticResource DataGridRowStyle}"
                    SelectionUnit="FullRow"
                    VerticalAlignment="Top"
                    Visibility="{Binding Path=InvoiceLineGridVisibility}"
                    Initialized="_invoiceLineGrid_Initialized">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Line Number" MinWidth="50"  Binding="{Binding InvoiceLineNumber}" />
                        <DataGridTextColumn Header="Description" MinWidth="50" Width="*" Binding="{Binding Description}" />
                        <DataGridTextColumn Header="Quantity" MinWidth="50" Binding="{Binding Quantity}" />
                        <DataGridTextColumn Header="Extended Cost" MinWidth="50" Width="*" Binding="{Binding ExtendedCost}" />
                    </DataGrid.Columns>
                    <DataGrid.GroupStyle>
                        <GroupStyle>
                            <GroupStyle.ContainerStyle>
                                <Style TargetType="{x:Type GroupItem}">
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                                <Expander>
                                                    <Expander.Header>
                                                        <StackPanel>
                                                            <TextBlock Text="{Binding Name}" />
                                                        </StackPanel>
                                                    </Expander.Header>
                                                    <ItemsPresenter />
                                                </Expander>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </GroupStyle.ContainerStyle>
                        </GroupStyle>
                    </DataGrid.GroupStyle>
                </DataGrid>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
</Grid>
</UserControl>

我想我需要添加如下内容:

<CollectionViewSource>
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="DepartmentBillingCode" />
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

如果我将CollectionViewSource 添加为资源并更改DataGrid 绑定,则网格中没有行。 如果我将CollectionViewSource 添加到DataGrid,我会得到一个异常:Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead. 嵌套在Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception. 但我在DataGrid.ItemSource 上看不到GroupDescriptionPropertyGroupDescription

所以,我现在感觉很迷茫。 任何建议表示赞赏。

谢谢

【问题讨论】:

  • @Георгий Ланец,感谢您的编辑。很高兴看到老问题得到关注。
  • 保罗,欢迎您。我喜欢使代码完美。这就是为什么我总是选择截止日期。

标签: wpf datagrid binding grouping


【解决方案1】:

所以我找到了一个可能的答案。我愿意接受其他人的解释。这是一个好的解决方案吗?

应用SO post regarding what part of MVVM pattern is resonsible for grouping of DataGrid,我开始寻找在 ViewModel 中生成分组的解决方案。我在WpfTutorial.com上找到了一个简单的例子

在我的 InvoicePageViewModel 中,我创建了一个新属性,该属性从我的列表中创建一个 ListViewCollection。 ListViewCollection 允许我添加自己的 GroupDescription,如下所示:

    public ListCollectionView GroupedInvoiceLines
    {
        get
        {
            ListCollectionView groupedLines = new ListCollectionView(InvoiceLines); // TODO should this be cached?

            groupedLines.GroupDescriptions.Add(new PropertyGroupDescription("DepartmentBillingCode"));

            return groupedLines;
        }
    }

然后将 DataGrid 上的数据绑定从 InvoiceLines 更改为 GroupedInvoiceLines 就很简单了。

评论?有问题吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多