【发布时间】:2021-07-03 11:07:04
【问题描述】:
假设我有 Item 类,它具有 ObjectId 类型的 Category 属性。
class Item
{
public ObjectId Id;
public string Name;
public ObjectId Category;
}
class Category
{
public ObjectId Id;
public string Name;
}
我想使用 ViewModel.Items 和 ViewModel.Categories 集合显示 DataGrid 中的所有项目。像这样。
| Id | Name | Category |
|---|---|---|
| Item.Id | Item.Name | Category.Name |
问题是,如何从 Category 实例中获取 Name 值,并与 Item.Category 属性的 Id 匹配?
根据我的发现,有 3 种方式:自定义转换器、使用反射和包装器对象的通用转换器。
1.自定义转换器
这是 WPF 的黄金标准(无论如何我都不喜欢)。我可以编写一个 CategoryIdToName 多值转换器,只需提供 ViewModel.Categories 和 Item.Category 即可获得类别名称。 p>
缺点是我必须使用样板代码创建很多转换器。
2。通用转换器
这与前面类似,但使用反射我可以编写 ObjectIdToInstanceValue 多值转换器并提供 3 个参数:集合、ObjectId 和属性名称。此转换器将尝试使用 ObjectId 在集合中查找项目并通过名称获取属性值。
缺点是反射很昂贵(至少据我所知)。但我只需要一个转换器。
这两种方法对我没有吸引力。我个人不喜欢转换器,我相信它们会影响应用程序的性能。
3。对象包装器
我从未见过有人实施甚至建议过这种方法。基本上,我可以创建一个 DataGridItem 类,它可以具有 Item 和 Category 属性。然后在 ViewModel 中我可以填充集合并直接绑定到属性。
有趣的是,我从未见过这种方式在任何地方使用。
那里最好的方法是什么?
【问题讨论】:
-
与其描述您的代码,不如显示您的代码。当我们可以准确地看到您在做什么时,帮助解决您的问题会容易得多。
-
'如何获得 Category 实例以显示有关它的一些信息我如何获得 Category 实例以显示有关它的一些信息' - 什么是“Category 实例”以及什么是“它” ?
-
@Jonathan 抱歉,我不够清楚,我需要显示具有相应 ID 的类别名称。就像我们在代码中编写 GetCategory(Item.Category).Name.
-
啊,我明白了。然后,是的,就像@mm8 下面所说的那样,您应该创建一个视图模型来表示网格中的行,用值构建它,然后将 that 返回到您的视图。 MVVM(或在较小程度上,MVC)模式。