我对 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 操作,我可以通过它,但没有任何代码是理想的。
有任何想法吗?