首页 文章

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

提问于
浏览
1

使用MVVM,一种类型的ViewModel包括他们作为Field重复的模型 .

所以我有一个CompanyModel和一个CompanyViewModel,它有一个CompanyModel实例 .

该CompanyModel有一系列属于它的Divisions . 所以CompanyModel有一个List(或一些集合类) .

现在,CompanyViewModel希望将这些部门表示为 ObservableCollection<DivisionViewModel> ;你可以在CompanyViewModel中添加新的Divisions .

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

我有更多像这样的父/子关系的类,所以我想要一些我可以在AbstractViewModel类中重用或实现的东西 .

注意:我的ViewModel实现了IEditableObject

1 回答

  • 1

    可能最简单的方法是创建一个继承自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实例,这类事情 . 您可以使用上面的“新”函数来创建各种实体的新实例,并且您可以在各种Linq查询中使用上面的“map”函数,这样您就可以弄清楚,例如,viewmodel的哪个实例ObservableCollection映射到List中的模型 .

    您可以在上面的示例中使用它,也许如下:

    var divisionViewModels = new SynchronizedObservableCollection(
        company.DivisionList, 
        division => new DivisionViewModel(division),
        divisionVm => divisionVm.Model,
        (division, divisionVm) => divisionVm.Model == division);
    

    确切的实现留给读者一个练习:-) . 但我在以前的项目中使用了这样的课程并取得了一些成功 . 只要确保你围绕它进行一些好的单元测试,这样你就知道你可以依赖它,并且不必花费大量时间来寻找事件处理的callstack .

相关问题