gpt4 book ai didi

c# - 将数据网格列绑定(bind)到 View 模型

转载 作者:行者123 更新时间:2023-12-03 10:56:35 25 4
gpt4 key购买 nike

我有一个完美运行的 View 模型,它基本上具有以下属性:

    -ItemCollection
- Name
- Type
- DayCollection
- DateOfDay
- Value

我现在正试图让 View 按如下方式呈现数据:
Name | Type  | DateOfDay1 | DateOfDay2 | DateOfDay3 ...
Dave | Actual| 1.2 | 1.8 | 5.4
Mary | Actual| 3.4 | 2.3 | 6.4
...

问题是,当我将 ItemCollection 绑定(bind)到 View 中的 Datagrid 时, View 显示:
Name | Type  | DayCollection
Dave | Actual| (Collection)
Mary | Actual| (Collection)

至关重要的是 - 与下面的一些示例不同,我的用例更简单 - ItemCollection 中的所有项目在 DayCollection 中的天数将始终完全相同 - 即我的表的所有行都将具有相同数量的列。虽然请注意,不同的 ItemCollection 可能有不同的天数(但在该 ItemCollection 中,所有项目的天数都相同) - 所以我不能只是展平上述 View 模型并拥有一个 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>

像上面这样的东西将是一个简单用例的简单解决方案,但显然不支持

我确信这个简单的问题有一个简单的解决方案,但我找不到任何方法来实现上述目标 - 上面引用的文章似乎过多,并且是为更复杂的用例设计的(可变数量的列和列可以动态添加和删除) - 我不需要这种灵 active ,我不想仅仅为了得到固定数量的列而实现它。

我唯一的另一个想法是在我的 View 模型中有一个诸如 ToDataTable() 之类的属性,它将从我的 View 模型中输出一个包含完整行和列的数据表,我可以将数据网格绑定(bind)到它,但这似乎又是一个浪费 - 然后检查更新并将这些更新引导到上述工作 View 模型中已经存在的业务逻辑将变得更加困难。

是否有一个简单的解决方案,或者我是否会为一个简单的用例投入大量代码?

最佳答案

View 模型的全部意义在于以 View 可以轻松使用的格式准备数据。如果您的 View 模型没有这样做,那么它就不是“完美地工作”,实际上它甚至没有做它应该做的一项工作!您需要做的是创建一个中间结构,将您的数据以正确的格式解包,然后 use data-binding to create your columns dynamically .

正如您已经发现的那样,这个问题的通用解决方案确实存在使用诸如行为等之类的东西。行为通常比代码隐藏更干净和通用,但它们仍然是 View 层的一部分,所以这些解决方案实际上只是带- 试图将不良 View 模型数据塞入 View 的辅助工具。你应该做的是解决更根本的、潜在的问题,并在你的 View 模型层解决问题。

有许多不同的方法可以做到这一点,但一个简单的解决方案是将所有数据打包到 DataTable 中,然后将 DataGrid 绑定(bind)到该数据表。这段代码应该对一种方法给出一个非常粗略的想法:

<DataGrid ItemsSource="{Binding MyTable}" />

...

public class MainViewModel : ViewModelBase
{
public DataTable MyTable { get; } = new DataTable();
private int NumColumns = 3;

public MainViewModel()
{
this.MyTable = new DataTable();
this.MyTable.Columns.Add("Name");
this.MyTable.Columns.Add("Type");
for (int i = 1; i <= NumColumns; i++)
this.MyTable.Columns.Add($"Day {i}");

var row = this.MyTable.NewRow();
row.ItemArray = new object[] { "Tom", "Type A", "1.2", "2.3", "3.4" };
this.MyTable.Rows.Add(row);

row = this.MyTable.NewRow();
row.ItemArray = new object[] { "Dick", "Type B", "2.3", "3.4", "4.5" };
this.MyTable.Rows.Add(row);

row = this.MyTable.NewRow();
row.ItemArray = new object[] { "Harry", "Type C", "3.4", "4.5", "5.6" };
this.MyTable.Rows.Add(row);
}
}

enter image description here

关于c# - 将数据网格列绑定(bind)到 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55928227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com