【问题标题】:WPF DataGrid with multiple source data and grouped columns具有多个源数据和分组列的 WPF DataGrid
【发布时间】:2013-09-20 18:42:46
【问题描述】:

我对 WPF 比较陌生,我正在尝试制作一个控件来显示来自多个源对象的数据。源对象存储在我的视图模型中的一个集合中,每个项目都有一个名称和一个数据对象集合。每个数据对象都有一些代表它的属性。数据结构如下所示:

在视图模型中

ObservableCollection<MySourceObjectType> sourceItems {get; set;}

MySourceObjectType:

SomeType Name {get; set;}
SomeType Number {get; set;}
IList<MyDataObjectType> {get; set;}

我的数据对象类型:

SomeType data1 {get; set;}
SomeType data2 {get; set;}
SomeType data3 {get; set;}

我希望我的网格看起来像这样:

除了该布局之外,控件还需要支持对与每个源对象对应的列组进行重新排序,并且所有行都需要一起垂直滚动,就好像它们都在同一个数据网格中一样。列和组标题也需要冻结在顶部,以便无论滚动位置如何,它们都是可见的。各个列不应相互重新排序,并且列组必须始终保持在一起。源项目可以是任意大小的集合,因此我无法预定义组,但每个组中的列是预定义的并且不会更改。

目前我通过使用ListBox 将其ItemSource 绑定到sourceItems 来实现此功能。 ItemsPanel 是一个停靠面板,带有一个用于超级标题的文本框和一个用于显示每个项目数据的数据网格。我可以使用一堆事件处理程序通过拖放重新排序它们,并且我也将滚动与事件处理程序同步。当前的重新排序是获取对源集合的引用,并在发生违反 mvvm 的丢弃时重新排序。

我想知道除了为每个项目使用单独的DataGrid 之外,是否有更好、更简洁的方法来执行此操作。我玩过为每个项目自动生成的列,然后单元格模板将是另一个 DataGrid。我不知道如何使它工作,除了由 DataGrid 本身处理的组重新排序之外似乎没有任何更好的方法。

我目前的想法是,我必须为 GroupedDataGrid 或其他任何东西创建一个自定义控件,并赋予它对组重新排序的能力,但我肯定会对完成任务的更简单方法感兴趣。

我的基本要求是它必须遵循严格的 MVVM 并且我的主要 xaml 布局不能有任何代码。我想如果背后的代码是最少的并且纯粹是 UI 操作我可以通过它,但没有任何代码是理想的。

有什么想法吗?

【问题讨论】:

  • 绝对是自定义控件的理想选择。您可能可以通过修改标题模板来获得多跨列,但重新排序会很棘手,并且不可避免地会在您的窗口处理中绑定太多代码。

标签: c# wpf xaml mvvm datagrid


【解决方案1】:

这将是一个部分答案,因为提供一个实现需要一些时间,但既然这对我很感兴趣,我稍后会尝试为您提供一个实现。

你需要做的是使用分组,

  1. 为您的对象添加一些通用属性,例如将它们区分为组

     public Type GroupType
     {  
         return typeof(...); 
     }
    

或者一个枚举

     public EGroupType GroupType
     {  
        return EGroupType.GroupA;    
     }

2。提供一个 GroupItem Style + ControlTemplate ,一个 gridview 或 datagrid ,它的 itemssource 绑定到 GroupItems ,从链接中用 datagrid 替换 itemscontrol。

3. 为 GroupBox 提供 Style + ControlTemplate ,其中包含 ScrollViewer 。 这是我需要进一步检查自己的事情,我相信类似于

 <ScrollViewer>
     <ContentPresenter />
 </ScrollViewer>  

在提供 GroupItem 模板时应该可以解决问题。

4.组。

    <CollectionViewSource Source="{Binding sourceItems}" x:Key="cvs">
         <CollectionViewSource.GroupDescriptions>
               <PropertyGroupDescription PropertyName="GroupType"/>
         </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

在您的窗口中。

    <GroupBox ItemsSource={StaticResource cvs} />

【讨论】:

  • 我肯定有兴趣看看这是否有效。分组是我首先研究的事情之一,但最终没有进一步追求。
猜你喜欢
  • 1970-01-01
  • 2014-10-05
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2013-11-20
  • 2013-04-09
  • 1970-01-01
相关资源
最近更新 更多