4

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

在视图模型中

ObservableCollection<MySourceObjectType> sourceItems {get; set;}

我的源对象类型:

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

我的数据对象类型:

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

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

示例网格布局

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

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

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

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

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

有任何想法吗?

4

1 回答 1

3

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

您需要做的将涉及使用分组,

  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} />
于 2013-09-20T20:03:34.283 回答