如果标题让人困惑,我很抱歉,但我真的不知道如何缩短我的问题。不管怎样,我开始了。
我正在使用WPF,Entity Framework和MVVM。
目前,在我的ViewModel中,我有一个属性
public Model.Document Document {get;set;} //Model.Document is an EF Entity
然后,在XAML中,我绑定到
<TextBox Text={Binding Path=Document.Title}/>
标题当然是模型上的属性。
现在我想到了下面的问题:为了将Model与View分离,如果我像这样向ViewModel添加一个属性,岂不是更好
public string Title
{
get { return Document.Title; }
set { Document.Title = value; }
}
然后像这样绑定:
<TextBox Text={Binding Path=Title}/>
推荐哪种方式?
5条答案
按热度按时间sxissh061#
如果您看一下数据绑定引用是如何解决的,您可以看到,在决定如何公开要绑定到的属性时,可能需要考虑性能问题。
Model.Document是否实现了INotifyPropertyChanged接口?如果没有,我建议在视图模型中添加一个Title属性,并在视图模型中实现INotifyPropertyChanged,这样当Title被更改时,就会引发PropertyChanged事件来通知视图。
另一种方法是将视图模型上的Title公开为DependencyProperty,因为绑定和呈现时间更快。
qvtsj1bj2#
这真的取决于你的情况。在最真实的意义上,视图应该只与视图模型交互。但是上面两种方法都有它们的优点。
通过公开Document属性,您不必复制需要访问它的所有属性。因此,如果您有许多属性,或者正在使用某种反射(例如在PropertyGrid中显示Document),那么这种方式可能更好。
后一种方法可以让你更好地控制暴露给View的值。因此,你可以在提交给模型或其他各种操作之前更改标题(即删除多余的空格)。你甚至可以在View不知道(甚至不关心)的情况下交换出Document。
apeeds0o3#
您可以看看**WPF Application Framework (WAF)的BookLibrary**示例应用,它使用第一种方法,仍然遵循MVVM模式(关注点分离,单元可测试)。
这简化了视图模型,因为绑定使用了实体的 INotifyPropertyChanged 实现。否则,您必须在视图模型之间手动同步更改。
5jvtdoz24#
后者是更好的方法,至少在我看来是这样。我还没有真正看到过另一种方法。视图模型充当视图和模型之间的中介,所以这两者不应该有任何关于对方的知识。
举个简单的例子:https://web.archive.org/web/http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/432/MVVM-for-Tarded-Folks-Like-Me-or-MVVM-and-What-it-Means-to-Me.aspx
hec6srdp5#
我不认为只读绑定到其值不改变的模型属性有任何问题。
不过,这是两个非常重要的条件。对模型属性的读/写绑定充满了潜在的麻烦,以至于我不会冷静地分析情况,看看这是否是没有任何属性的情况之一,而是在视图模型中实现一个属性并完成它。除非我的模型支持更改通知,如果我需要它,我可能会这样做,我需要在视图模型中实现它。