【问题标题】:WPF DataGrid displaying data based on IDWPF DataGrid 根据 ID 显示数据
【发布时间】: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.ItemsViewModel.Categories 集合显示 DataGrid 中的所有项目。像这样。

Id Name Category
Item.Id Item.Name Category.Name

问题是,如何从 Category 实例中获取 Name 值,并与 Item.Category 属性的 Id 匹配?

根据我的发现,有 3 种方式:自定义转换器、使用反射和包装器对象的通用转换器。

1.自定义转换器

这是 WPF 的黄金标准(无论如何我都不喜欢)。我可以编写一个 CategoryIdToName 多值转换器,只需提供 ViewModel.CategoriesItem.Category 即可获得类别名称。 p>

缺点是我必须使用样板代码创建很多转换器。

2。通用转换器

这与前面类似,但使用反射我可以编写 ObjectIdToInstanceValue 多值转换器并提供 3 个参数:集合、ObjectId 和属性名称。此转换器将尝试使用 ObjectId 在集合中查找项目并通过名称获取属性值。

缺点是反射很昂贵(至少据我所知)。但我只需要一个转换器。

这两种方法对我没有吸引力。我个人不喜欢转换器,我相信它们会影响应用程序的性能。

3。对象包装器

我从未见过有人实施甚至建议过这种方法。基本上,我可以创建一个 DataGridItem 类,它可以具有 ItemCategory 属性。然后在 ViewModel 中我可以填充集合并直接绑定到属性。

有趣的是,我从未见过这种方式在任何地方使用。

那里最好的方法是什么?

【问题讨论】:

  • 与其描述您的代码,不如显示您的代码。当我们可以准确地看到您在做什么时,帮助解决您的问题会容易得多。
  • '如何获得 Category 实例以显示有关它的一些信息我如何获得 Category 实例以显示有关它的一些信息' - 什么是“Category 实例”以及什么是“它” ?
  • @Jonathan 抱歉,我不够清楚,我需要显示具有相应 ID 的类别名称。就像我们在代码中编写 GetCategory(Item.Category).Name.
  • 啊,我明白了。然后,是的,就像@mm8 下面所说的那样,您应该创建一个视图模型来表示网格中的行,用值构建它,然后将 that 返回到您的视图。 MVVM(或在较小程度上,MVC)模式。

标签: c# wpf mvvm binding


【解决方案1】:

如果您想在DataGrid 中显示三列,您应该创建一个视图模型类,并为这些列中的每一列设置一个属性。我想这就是您在问题中所说的对象包装器

DataGrid 的视图模型将负责将您当前的数据转换为IEnumerable<T>,其中T 是具有IdNameCategory 属性的视图模型或包装器类型。

然后,您将像往常一样将DataGridItemsSource 绑定到此IEnumerable<T> 属性,并将每列绑定到T 的属性。

简而言之,这是一个 MVVM 解决方案。

【讨论】:

    【解决方案2】:

    这里有一些伪代码(未真正检查)添加到我的评论/@mm8 的解决方案中:

    public class GridItem(){
      public string ItemName {get;set;}
      public string CategoryName {get;set;}
    }
    

    然后是一些方法来查询和建立你的GridItem 集合:

    public IEnumerable<GridItem> GetGridItems(){
      return _repository.Items.Select(i => new GridItem{
        ItemName = i.Name,
        CategoryName = i.Category.Name
      })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      相关资源
      最近更新 更多