Wpf MVVM—直接绑定到从VM公开的模型对象,或在VM中实现单独的属性以访问模型属性

Wpf MVVM—直接绑定到从VM公开的模型对象,或在VM中实现单独的属性以访问模型属性,wpf,entity-framework,mvvm,Wpf,Entity Framework,Mvvm,很抱歉,如果标题让人困惑,但我真的不知道如何缩短我的问题。不管怎样,就这样 我正在使用WPF、实体框架和MVVM 目前,在我的ViewModel中,我有一个属性 public Model.Document Document {get;set;} //Model.Document is an EF Entity 然后,在XAML中,我绑定到 <TextBox Text={Binding Path=Document.Title}/> 然后像这样绑定: <TextBox Text

很抱歉,如果标题让人困惑,但我真的不知道如何缩短我的问题。不管怎样,就这样

我正在使用WPF、实体框架和MVVM

目前,在我的ViewModel中,我有一个属性

public Model.Document Document {get;set;} //Model.Document is an EF Entity
然后,在XAML中,我绑定到

<TextBox Text={Binding Path=Document.Title}/>
然后像这样绑定:

<TextBox Text={Binding Path=Title}/>


推荐哪种方法?

后者是更好的方法,至少在我看来是这样。我还没有真正看到过另一种方法。viewmodel充当视图和模型之间的中介,因此这两个模型不应该真正了解彼此


这里有一个简单的例子

这取决于你的情况。在最真实的意义上,视图应该只与视图模型交互。但上述两种方法都有各自的优势

通过公开文档属性,您不必复制需要访问的所有属性。因此,如果您有许多属性,或者正在使用某种反射(例如在PropertyGrid中显示文档),那么这种方式可能更好

后一种方法使您能够更好地控制向视图公开的值。因此,您可以在将标题提交到模型或各种其他操作之前更改标题(即删除额外的空格)。你甚至可以从文档中交换出来,而不必看到它(甚至关心)。

如果你看一下,你可以看到在决定如何暴露你要绑定的属性时,会有一些性能问题需要考虑。 Model.Document是否实现了接口?如果没有,我建议将Title属性添加到视图模型中,并在视图模型上实现INotifyPropertyChanged,以便在更改标题时引发事件以通知视图


另一种方法是将视图模型上的标题公开为,因为绑定和渲染时间更快。

对于值不变的模型属性的只读绑定,我看不出有任何问题


不过,这是两个非常重要的条件。对模型属性的读/写绑定充满了潜在的问题,因此,与其冷静地分析情况,看看这是否是没有任何问题的情况之一,我只需在视图模型中实现一个属性,并完成它。除非我的模型支持更改通知,否则如果我需要它(我可能需要),我将需要在视图模型中实现它。

您可以查看图书库示例应用程序。它使用第一种方法,并且仍然遵循MVVM模式(关注点分离,单元可测试)


这简化了ViewModels,因为绑定使用实体的INotifyPropertyChanged实现。否则,您必须在ViewModels之间手动同步更改。

这是一篇非常有趣的文章(数据绑定引用是如何解析的)。文档从中继承的实现了“INotifyPropertyChanged”,因此这就得到了解决。但是,我的ViewModel也实现了INotifyPropertyChanged。因此,我以何种方式实现属性并不重要。属性不是一个选项,因为我的ViewModel不会从DependencyObject继承(我认为这是一个要求?)。相反,它继承自MVVM Light framework的ViewModelBase类。使用INotifyPropertyChanged通常是最简单和最简单的选项。绑定到r/w属性充满潜在问题是什么意思?你有一些例子吗?
<TextBox Text={Binding Path=Title}/>