【发布时间】:2019-04-30 20:26:40
【问题描述】:
我有一个完美运行的视图模型,它基本上具有以下属性:
-ItemCollection
- Name
- Type
- DayCollection
- DateOfDay
- Value
我现在正试图让视图按如下方式呈现数据:
Name | Type | DateOfDay1 | DateOfDay2 | DateOfDay3 ...
Dave | Actual| 1.2 | 1.8 | 5.4
Mary | Actual| 3.4 | 2.3 | 6.4
...
问题是当我将 ItemCollection 绑定到视图中的 Datagrid 时,视图显示:
Name | Type | DayCollection
Dave | Actual| (Collection)
Mary | Actual| (Collection)
至关重要 - 与下面的一些示例不同,我的用例更简单 - ItemCollection 中的所有项目在 DayCollection 中的天数总是完全相同 - 即我的表的所有行都将具有相同的天数列。虽然请注意,不同的 ItemCollection 可能有不同的天数(但在该 ItemCollection 中,所有项目的天数都相同) - 所以我不能只是展平上述视图模型并拥有一个 ItemCollection,例如:
-ItemCollection
- Name
- Type
- Day1
- Day2
- Day3
因为一个 ItemCollection(表)可能有 5 天,另外 30 天。
我发现以下文章讨论了动态添加列 - 我在编辑期间无需添加或删除列 - 列数是固定的:
https://www.codeproject.com/Articles/899637/Dynamic-Columns-in-a-WPF-DataGrid-Control-Part
http://www.unixresources.net/faq/320089.shtml
https://www.codeproject.com/Tips/676530/How-to-Add-Columns-to-a-DataGri
我发现上述示例过于复杂,因为我认为这是一个非常简单的用例 - 项目(行)数量可变,但每行中的列数固定(预定)[上述最后一个虽然文章写得很好]。我有点希望我可以使用重复的 xaml 简单地定义列,例如:
<DataGrid ...>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Type" Binding="{Binding Type}" />
<Repeater ItemsSource="{Binding DayCollection}">
<DataGridTextColumn Header="{Binding DateOfDay}" Binding="{Binding Value}" />
</Repeater>
</DataGrid.Columns>
</DataGrid>
类似上面的方法是一个简单用例的简单解决方案,但显然不支持
我确信这个简单的问题有一个简单的解决方案,但我找不到任何方法来实现上述目标 - 上面引用的文章似乎过多,并且是为更复杂的用例(可变数量的列和可以动态添加和删除的列)- 我不需要这种灵活性,我不想仅仅为了得到固定数量的列而实现它。
我唯一的想法是在我的视图模型中拥有一个诸如 ToDataTable() 之类的属性,它将从我的视图模型中输出一个数据表,其中包含完整的行和列,我可以将数据网格绑定到,但又一次这似乎是一种浪费——然后检查更新并将这些更新引导到上述工作视图模型中已经存在的业务逻辑会变得更加困难。
是否有一个简单的解决方案,或者我是否会为一个简单的用例投入大量代码?
【问题讨论】:
-
实际上另一个想法是我可以将我的名称和类型添加到我的 DayCollection(将其重命名为 ColumnCollection)并绑定到它,这似乎又是一个肮脏的修复,因为理想情况下我会将它们分开我的日子里有不适用于名称和类型的业务逻辑
-
编辑——实际上这只会让我的问题变得更糟——记住你不绑定列而是绑定行,所以我最终会得到一列带有 (Collection) 的列 ColumnCollection。跨度>