c# - WPF 中的 MVVM 模式 - 如何处理我无法控制的模型?

标签 c# wpf mvvm

过去几天我一直在深入研究 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/

    相关文章:

    c# - C# 中的反射和运算符重载

    wpf - XAML 中的 "Conditional Compile"?

    c# - 如何在 WPF 中为图像缩放变化设置动画?

    c# - 如何从 ListView 中绑定(bind) Combobox 的 SelectedItem/Value/ValuePath

    silverlight - 如何限制 slider 的值更改事件?

    c# - 在 C# 中获取具有 2 位数年份的特定于文化的日期

    c# - 如何在 C# 中为 protobuf map<string, string> 属性设置值

    c# - 在 WordPress 中格式化 C# 的最佳方式是什么?

    wpf - 一起使用 F# 和 Caliburn.Micro

    c# - 将 Button 绑定(bind)到 ItemsControl 容器中的 RelayCommand