MVVM同步列表<;字符串>;

MVVM同步列表<;字符串>;,mvvm,collections,Mvvm,Collections,我认为这是解决我问题的办法,但我正在努力理解如何把它应用到我的问题上。像另一篇文章一样,我有两个收藏我想保持同步。我的模型对象具有字符串集合: public class Person { public int PersonId {get; set; } public string PersonName { get; set; } public List<string> PersonNicknames { get; set; } } 在PersonViewMo

我认为这是解决我问题的办法,但我正在努力理解如何把它应用到我的问题上。像另一篇文章一样,我有两个收藏我想保持同步。我的模型对象具有字符串集合:

public class Person {
    public int PersonId {get; set; }
    public string PersonName { get; set; }
    public List<string> PersonNicknames { get; set; }
}

PersonViewModel.昵称ViewModelCollection
中添加、删除或更改字符串时,更改不会反映在模型集合中(即
Person.昵称
)。每当用户修改、编辑或删除字符串项时,我都需要更新模型集合。我不明白链接答案是如何工作的,也不知道如何将其应用于这个问题。举个例子会令人惊讶。。。我在这里不知所措。

这是我的标准解决方案,适用于您正在搜索的内容。对于您的场景来说,它有一点开销,因为它与ViewModel类型一起工作,该类型有一个用于上下文的字段,等等。无论如何,解决方案应该变得显而易见。如果模型集合本身是可观察的,则集合通常会向一个方向与源同步,而向两个方向同步。这对你有帮助吗?如果没有,请询问

//
///可观察的ViewModels集合,将更改推送到相关的模型集合
/// 
///集合中ViewModels的类型
///基础集合中的模型类型
公共类VmCollection:ObservableCollection
其中TViewModel:class,IViewModel,new()
其中TModel:class
{
私有只读对象_上下文;
私有只读ICollection_模型;
私人楼宇同步禁用;
/// 
///建造师
/// 
///要同步的模型列表
/// 
/// 
///确定是否应删除ViewModels集合
///在构造时从模型集合中获取
/// 
公共VmCollection(ICollection模型,对象上下文=null,bool autoFetch=true)
{
_模型=模型;
_上下文=上下文;
//同步的寄存器更改处理
//从视图模型到模型
CollectionChanged+=ViewModelCollectionChanged;
//如果模型集合是可观察的,则寄存器更改
//处理从模型到ViewModels的同步
如果(模型是可观察的集合)
{
var observableModels=作为ObservableCollection的模型;
observableModels.CollectionChanged+=ModelCollectionChanged;
}
//Fecth视图模型
if(自动获取)FetchFromModels();
}
/// 
///ViewModelCollection的CollectionChanged事件
/// 
公共重写密封事件NotifyCollectionChangedEventHandler CollectionChanged
{
添加{base.CollectionChanged+=value;}
删除{base.CollectionChanged-=value;}
}
/// 
///从模型集合加载VM集合
/// 
public void FetchFromModels()
{
//停用更改推送
_synchDisabled=true;
//清册
清除();
//为每个模型创建并添加新VM
foreach(t模型在_模型中)
AddForModel(模型);
//重新激活更改推送
_synchDisabled=false;
}
私有void ViewModelCollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e)
{
//如果同步在内部被禁用,则返回
如果(_synchDisabled)返回;
//禁用同步
_synchDisabled=true;
//同步模型集合
如果(如NewItems!=null)
foreach(e.NewItems.OfType()中的var v)
v、 AddModelTo(_models);
如果(例如,OldItems!=null)
foreach(e.OldItems.OfType()中的变量v)
v、 从(_模型)中移除模型;
//启用同步
_synchDisabled=false;
}
私有void ModelCollectionChanged(对象发送方,notifycollectionchangedventargs e)
{
如果(_synchDisabled)返回;
//同步ViewModels的集合
如果(如NewItems!=null)
foreach(e.NewItems.OfType()中的TModel m)this.addifyNotNull(CreateViewModel(m));
如果(e.OldItems!=null)foreach(e.OldItems中的TModel m)此.removiefcontains(GetViewModelOfModel(m));
}
专用TViewModel CreateViewModel(TModel模型)
{
返回ViewModelCache.Get.ForExistingModel(model,_context);
}
私有TViewModel GetViewModelOfModel(TModel模型)
{
将Items.OfType().FirstOrDefault(v=>v.IsViewModelOf(model))作为TViewModel返回;
}
/// 
///为指定的模型实例添加新的ViewModel
/// 
///要为其创建ViewModel的模型
public void AddForModel(TModel模型)
{
添加(CreateViewModel(模型));
}
/// 
///添加具有指定类型的新模型实例的新ViewModel,
///哪个是模型类型,哪个是从模型类型派生的
/// 
///要为其添加ViewModel的模型类型
public void AddNew(),其中tsSpecificModel:TModel,new()
{
var m=新的TSSpecificModel();
添加(CreateViewModel(m));
}
}

谢谢您的回答。我认为ViewModelCollectionChanged是负责将更改推回到模型集合的方法,对吗?AddModelTo和RemoveModelFrom做什么?是的,ViewModelCollectionChanged推送到模型集合。AddModelTo和remove model from是将模型集合作为参数并从该列表中删除模型的方法。这允许从模型集合中删除这些模型,而无需在ViewModel中公开模型。这是可选的,但是,您可以直接更新模型集合。到目前为止,如果添加或删除某个项目,我已经同步了集合。如果某个项目被编辑(即文本更改),并且我希望该更改反映在两个集合中,该怎么办?这实际上不是集合的问题,而是同步的集合中项目之间的关系问题。对于您的场景
        foreach (string stringItem in _person.PersonNicknames)
        {
            var nicknameViewModel = new NicknameViewModel(stringItem);
            this.NicknameViewModelCollection.Add(nicknameViewModel);
        }