gpt4 book ai didi

c# - 在 MVVM 中使用一个 View 对多种类型进行 CRUD

转载 作者:行者123 更新时间:2023-11-30 12:30:30 26 4
gpt4 key购买 nike

我有以下三种类型的项目:

public class StockItem
{
public int Id { get; set; }
public string Name { get; set; }
public decimal UnitPrice { get; set; }
}

public class LotItem : StockItem
{
public virtual ICollection<Lot> Lots { get; set; }
}
public class DetailedItem : StockItem
{
public virtual ICollection<SerialNumber> SerialNumbers { get; set; }
}

当我开发一个使用所有 MVVM、WPF、PRISM、EF5 的应用程序时,我有点卡住了:

首先:我如何使用一个根据类型更改(显示/隐藏控件)的 View 对这些类型进行 CRUD,我知道我以后可能会有继承自相同类型的新类型类型?
第二:如何将 View 绑定(bind)到 View 模型:

  • 是否需要公开动态属性才能处理这三种类型?
  • MVVM 中是否缺少克服此问题的提示?


最佳答案

另一种不破坏开/闭原则的​​方法是为每种类型的 StockItem 创建 View 模型和 View ,然后有一个类型可以整理所有公开的子类型及其相应的 View 模型,并提供一个采用 StockItem 并返回匹配 View 模型的工厂方法。

例如,使用 IoC 容器或 MEF 可以很容易地做到这一点。

更新

作为使用 MEF 的简单示例:

public class StockItemEditViewModelFactory : IPartImportsSatisfiedNotification
{
private Dictionary<Type, IStockItemEditViewModelResolver> resolvers;

[ImportMany(IStockItemEditViewModelResolver)]
private IEnumerable<IStockItemEditViewModelResolver> importedResolvers;

public void OnImportsSatisfied()
{
// Build dictionary of StockItem -> StockItemEditViewModel
// Do error handling if no imported resolvers or duplicate types
resolvers = new Dictionary<Type, IStockItemEditViewModelResolver>

foreach(var importedResolver in importedResolvers)
{
resolvers.Add(importedResolver.StockItemType, importedResolver);
}
}

public IStockItemEditViewModel Create(StockItem stockItem)
{
// Find the appropriate resolver based on stockItem.GetType(), handle errors
var type = stockItem.GetType();
var entry = this.resolvers.FirstOrDefault(kv => kv.Key == type);
var resolver = entry.Value;
return resolver.CreateEditViewModel(stockItem);
}
}

[InheritedExport]
public interface IStockItemEditViewModelResolver
{
Type StockItemType { get; }
IStockItemEditViewModel CreateEditViewModel(StockItem stockItem);
}

public class LotItemEditViewModelResolver : IStockItemEditViewModelResolver
{
Type StockItemType { get { return typeof(LotItem); } }

IStockItemEditViewModel CreateEditViewModel(StockItem stockItem)
{
return new LotItemEditViewModel(stockItem);
}
}

public class MainViewModel
{
public IStockItemEditViewModel ActiveItem { get; private set; }

public MainViewModel(StockItemEditViewModelFactory editViewModelfactory)
{
StockItem stockItem = new LotItem();
this.ActiveItem = editViewModelFactory.Create(myStockItem);
}
}

这是未经测试的,但它向您展示了一般方法。您可以使用泛型来使它更整洁。

如果您想使用 Unity 而不是 MEF,那么概念是相同的,但是您需要注册 IStockItemEditViewModelResolver 的每个实现(或使用 Unity 扩展并按照约定进行),然后您的工厂将需要对容器的引用,以便它可以执行 ResolveAll(请参阅 Unity Resolve Multiple Classes)。

关于c# - 在 MVVM 中使用一个 View 对多种类型进行 CRUD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15920663/

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