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

Wpf MVVM:处理集合中模型的逻辑子对象,wpf,collections,mvvm,observablecollection,Wpf,Collections,Mvvm,Observablecollection,使用MVVM,一种类型的视图模型包括它们表示为字段的模型 所以我有一个CompanyModel和一个CompanyViewModel,它有一个CompanyModel实例 这个公司模型有一个属于它的部门集合。因此CompanyModel有一个列表(或一些集合类) 现在,公司视图模型希望将这些部门表示为一个可观察集合;您可以在公司视图模型中添加新的部门 确保ObservableCollection和Models集合保持同步的最佳方法是什么?因此,当我添加一个新的DivisionViewModel并

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

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

这个公司模型有一个属于它的部门集合。因此CompanyModel有一个列表(或一些集合类)

现在,公司视图模型希望将这些部门表示为一个
可观察集合
;您可以在公司视图模型中添加新的部门

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

我有更多类似于父/子关系的类,所以我希望可以在AbstractViewModel类中重用或实现一些东西


注意:My 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.
    }
}

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

最简单的方法可能是创建一个继承自ObservaleCollection的新类,它以源列表和各种初始化和映射函数作为参数。其签名可能如下所示:

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.
    }
}

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

我会使用INotifyCollectionChanged事件。但实际上这取决于一项任务。如果您希望从服务接收模型并保存它,则同步没有意义。我将使用INotifyCollectionChanged事件。但实际上这取决于一项任务。如果你想从一个服务接收一个模型并保存它,同步是没有意义的。我喜欢它。我现在主要把它看作是一种单向转移,但我想如果我能观察到这两个集合,那么你可以双向转移。这是Observable不适合WPF/Silverlight的一个很好的理由。我喜欢它。我现在主要把它看作是一种单向转移,但我想如果我能观察到这两个集合,那么你可以双向转移。这是Observable不适合WPF/Silverlight的可靠原因。