过去几天我一直在深入研究 WPF,来自 WinForms 背景,我只是喜欢灵 active ,尤其是在绑定(bind)方面。
但是,在阅读了以下关于 MVVM 的文章后,我有一个问题:http://blog.alner.net/archive/2010/02/09/mvvm-to-wrap-or-not-to-wrap.aspx
如何处理我无法控制的模型,我无法为其添加接口(interface)等等,我只能按原样使用它们?
看这篇文章,我的一个选择是直接在我的 ViewModel 中公开模型,但这会是一个好方法吗?我也可以使用包装选项,但是如果它们没有 INotifyPropertyChanged 接口(interface),我如何将这些气泡的更改冒泡回 ViewModel?是否有任何其他选项允许对这些模型进行双向绑定(bind)?
编辑:
将以下类视为我无法修改的模型,我的选择是什么:
[DataContract]
public class NPCTypeData
{
[DataMember]
public string Name;
[DataMember]
public List<NameAlias> Emotions;
}
[DataContract]
public class NameAlias
{
[DataMember]
public string Name;
[DataMember]
public string Alias;
}
我并不真正关心将这些转换为可绑定(bind)类所需的代码,我只想要一个或多个示例,说明从哪里开始像这样的嵌套依赖项。
我是否将所有数据复制到具有可绑定(bind)属性的模型中,然后将它们留作序列化,我是否将它们包装起来,还是什么?
最佳答案
我同意 Henk 的观点,并补充说一个选项可以是 Entity Framework 所做的“动态代理类创建”。基本上:你有你的 POCO 对象,Entity 框架可以动态附加必要的功能来跟踪模型的变化。
还有一个从类继承的选项,并使用 AOP 属性装饰类,该属性会即时生成所有必要的管道。
你可以谷歌搜索:
AOP INotifyPropertyChanged
- http://www.postsharp.net/ Automatic INotifyPropertyChanged using Dynamic Proxy
- http://jonas.follesoe.no/2009/12/23/automatic-inotifypropertychanged-using-dynamic-proxy/ 当我遇到这样的问题时,我基本上使用 Henk 解决方案,使用 AutoMapper 创建新类并包装每个属性。它有效吗?它是可维护的吗?是的,它起作用了,而且它是可维护的。痛吗? 是 .
public class NPCTypeDataViewModel
{
public string Name {
get;
set;
}
public List<NameAliasViewModel> Emotions {
get;
set;
}
public NPCTypeDataViewModel(NPCTypeData data){
Name = data.Name;
Emotions = data.Emotions.Select(x => new NameAliasViewModel(x))
.ToList();
}
public NPCTypeData GetModel(){
var ntd = new NPCTypeData(){
Name = Name,
Emotions = Emotions.Select(emo => emo.GetModel())
.ToList()
};
return ntd;
}
}
public class NameAliasViewModel
{
public string Name {
get;
set;
}
public string Alias {
get;
set;
}
public NameAliasViewModel(NameAlias alias){
Name = alias.Name;
Alias = alias.Alias;
}
public NameAlias GetModel(){
return new NameAlias(){
Name = Name,
Alias = Alias
};
}
}
关于c# - WPF 中的 MVVM 模式 - 如何处理我无法控制的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26463888/