绑定到模型并避免代理属性

时间:2012-09-16 15:11:25

标签: c# wpf design-patterns user-interface mvvm

以下代码说明了我的问题:

public class Person : (INotifyPropertyChanged) // INPC only for PersonViewModelB
{
    public string Name {get; set;}
}

public class PersonViewModelA : INotifyPropertyChanged
{
    private Person _person {get; set;}

    public string Name 
    {
        get { return _person.Name; }
        set { _person.Name = value; }
    }

    //XAML: {Binding Name}
}

public class PersonViewModelB : INotifyPropertyChanged
{
    private Person Person {get; set;}

    //XAML: {Binding Person.Name}
}

在很多例子中,我见过像PersonViewModelA这样的东西。我不明白这个好处。对我来说,PersonViewModelB更干净,更干燥。

在这两种情况下,我都可以向ViewModel(例如IsSelected)或计算字段(例如Name = FirstName +“”+ LastName)添加其他视图特定字段。如果我有一个richt域模型,为什么我不能将它暴露给视图?

在Asp.net MVC中,我们已经学会了将directy绑定到模型,并且它很好,但在WPF中它不是吗?为什么?

什么证明额外的开销是合理的?

2 个答案:

答案 0 :(得分:0)

当你看到像A这样的方法是因为底层对象不支持INotifyPropertyChanged,或者因为实际实现需要灵活性。

看到Person可以更改,然后您需要重建UI。但请考虑一下您的逻辑驻留在另一个DLL上并将ViewModel绑定到代理的情况。然后,如果您的模型发生变化并不重要,则无需再次重新编译UI。

答案 1 :(得分:0)

MVVM与MVC不同,MVC没有View-Model(并且更像是一个三角形而不是一条线)。不直接绑定到模型的一个原因是保持依赖关系最小化,因此如果模型更改,您可能只需要调整VM而不是VM 视图。