WPF中的MVVM模式 - 如何进行我无法控制的模型?

时间:2014-10-20 10:53:45

标签: c# wpf mvvm

过去几天我一直在进入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;
}

我并不真正关心将这些代码转换为可绑定类所需的代码,我只想要一个或多个示例来说明从哪里开始使用这样的嵌套依赖项。

我是否将所有数据复制到具有可绑定属性的模型中,并将这些数据保留为序列化,是否将它们包装起来,或者是什么?

1 个答案:

答案 0 :(得分:1)

我同意Henk,并且会补充一个选项可以是&#34;动态代理类创建&#34;这是实体框架的作用。基本上:您拥有POCO对象,实体框架可以动态附加必要的功能来跟踪模型的变化。

还可以选择从类继承,并使用AOP属性修饰类,该属性可以动态生成所有必要的管道。

你可以谷歌:

当我遇到这样的问题时,我基本上使用了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
        };
    }
}