过去几天我一直在进入WPF,来自WinForms背景,我只是喜欢灵活性,特别是在绑定方面。
但是,在阅读了有关MVVM的以下文章之后,我有一个问题:http://blog.alner.net/archive/2010/02/09/mvvm-to-wrap-or-not-to-wrap.aspx
如何进行模型我无法控制,我无法添加接口,等等,我只能按原样使用它们?
看一下这篇文章,我的一个选择是直接在我的ViewModel中公开Model,但这是一个很好的方法吗?我也可以使用包装选项,但如果他们没有INotifyPropertyChanged界面,如何将这些气泡的更改冒泡回ViewModel?是否还有其他选项允许TwoWay绑定到这些模型?
编辑: 将以下类视为我无法修改的模型,我有哪些选择:
[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;
}
我并不真正关心将这些代码转换为可绑定类所需的代码,我只想要一个或多个示例来说明从哪里开始使用这样的嵌套依赖项。
我是否将所有数据复制到具有可绑定属性的模型中,并将这些数据保留为序列化,是否将它们包装起来,或者是什么?
答案 0 :(得分:1)
我同意Henk,并且会补充一个选项可以是&#34;动态代理类创建&#34;这是实体框架的作用。基本上:您拥有POCO对象,实体框架可以动态附加必要的功能来跟踪模型的变化。
还可以选择从类继承,并使用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
};
}
}