【问题标题】:ViewModel with a Dynamic collection property具有动态集合属性的 ViewModel
【发布时间】:2011-11-16 06:18:59
【问题描述】:

我正在使用 WPF 和 MVVM 模式。所以我的问题是,是否有可能在辅助窗口/视图的 ViewModel 中有一个动态属性,该属性将有一些集合。

我的应用程序有不同的自定义类,它们是类别、供应商等的集合,我正在尝试创建一个 ViewModel,每次用户想要编辑集合的项目时,它都有一个属性来拥有这些集合之一.我怀疑这是否可以通过 ViewModel 实现。

在 ViewModel 中,我有布尔属性来显示或不显示 ListView 中的标签、文本框和一些列。而将成为 ViewModel 中的属性的 Collection 由 ListView 绑定。

我正在尝试通过这种方式,所以我可以防止为每个要编辑的集合创建一个窗口/视图。

我的课程:

public class SupplierCollection : CollectionBase, INotifyCollectionChanged, INotifyPropertyChanged
{
    (...)
}

public class StateCollection : CollectionBase, INotifyCollectionChanged, INotifyPropertyChanged
{
    (...)
}

public class PlaceCollection : CollectionBase, INotifyCollectionChanged, INotifyPropertyChanged
{
    (...)
}

提前致谢!

【问题讨论】:

  • 你能说明你提到的收集类是如何声明的吗?只是类签名,包括基类、实现的接口等。基本上我想通过一个通用接口抽象你的集合类,这样你就可以在 ViewModel 中使用它
  • 我在我的问题中添加了一些我的类以及它们实现了哪些接口......

标签: wpf mvvm collections wpf-controls datacontext


【解决方案1】:

如果我没记错你的笔记,你可以通过介绍以下enum来实现你想要的:

enum CollectionType
{
  Suppliers,
  States,
  Places
}

然后将以下属性添加到视图模型中:

public CollectionType CollectionToUse { get; set; }

然后使用switch 或者更解耦的东西,比如

IDictionary<CollectionType, CollectionBase> map = ....
if (map.ContainsKey(CollectionType.States))
{
    var states = map[CollectionType.States];
}

【讨论】:

  • 我的意思是 ViewModel 中的属性将是集合之一,具体取决于用户想要更改的集合,或者换句话说,每次用户想要编辑或更改收藏品之一。
  • 我无法理解如何通过枚举获取我当前的集合...我如何将枚举中的字段与我的集合相等?
  • 不,想法是检索正确的集合取决于 COllectionToUse 值,例如dictionary[CollectionToUse] - 引用集合
  • 我正在尝试另一件事,创建一个通用集合,因为我的所有集合都继承自 CollectionBase,所以也许我可以只有一个通用集合,然后我为我的每种类型的项目创建一个通用集合主视图模型。你认为呢?避免拥有太多窗口并尝试像我一样简化拥有一个动态是一个好主意?
  • @Miguel :如果您的所有实体都有公共接口或基类,您当然可以利用它并创建像 ICollection 这样的公共集合,但稍后您应该能够转换为更具体的类型,这是问题如何做和回答取决于您遵循的设计和要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多