gpt4 book ai didi

wpf - MVVM:处理集合中模型的逻辑子对象

转载 作者:行者123 更新时间:2023-12-03 10:40:28 29 4
gpt4 key购买 nike

使用MVVM,ViewModel的一种类型包括它们表示为字段的模型。

所以我确实有一个CompanyModel和一个具有CompanyModel实例的CompanyViewModel。

此CompanyModel具有属于它的Divisions的集合。因此CompanyModel有一个List(或某个集合类)。

现在CompanyViewModel想要将这些部门表示为ObservableCollection<DivisionViewModel>;您可以在CompanyViewModel中添加新的Divisions。

确保ObservableCollection和Models集合保持同步的最佳方法是什么?因此,当我添加新的DivisionViewModel并保存时,它会自动将其模型保存到CompanyModel的List<Division>中?

我有更多此类父/子关系类,因此我很喜欢可以重用或在AbstractViewModel类中实现的东西。

注意:我的ViewModels实现IEditableObject

最佳答案

可能最简单的方法是创建一个新类,该类继承自ObservableCollection,并使用源列表以及各种初始化和映射函数作为参数。它的签名可能看起来像这样:

public class SynchronizedObservableCollection<TDest, TSource> : ObservableCollection
{
public SynchronizedObservableCollection(
IList<TSource> source,
Func<TSource, TDest> newDestFunc,
Func<TDest, TSource> newSourceFunc),
Func<TSource, TDest, bool> mapSourceToDestFunc
{
// Initialize the class here.
}
}

然后,您需要处理CollectionChanged事件,在添加新的Destination实例时创建新的Source实例,在删除现有的Destination实例时删除现有的Source实例。您将使用上面的“new”函数来创建各种实体的新实例,并在各种Linq查询中使用上面的“map”函数,这些查询将使您找出例如您的 View 模型的哪个实例ObservableCollection映射到列表中的模型。

您可能会在上面的示例中使用它,例如:
var divisionViewModels = new SynchronizedObservableCollection(
company.DivisionList,
division => new DivisionViewModel(division),
divisionVm => divisionVm.Model,
(division, divisionVm) => divisionVm.Model == division);

确切的实现留给读者练习:-)。但是我在以前的项目中使用过类似的类,但取得了一些成功。只要确保您围绕它进行了一些良好的单元测试,就可以知道您可以依靠它,而不必花费大量时间在事件处理调用堆栈中进行搜索。

关于wpf - MVVM:处理集合中模型的逻辑子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069295/

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