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

jqjz2hbq  于 2023-04-07  发布在  其他
关注(0)|答案(5)|浏览(210)

如果标题让人困惑,我很抱歉,但我真的不知道如何缩短我的问题。不管怎样,我开始了。
我正在使用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}/>

推荐哪种方式?

sxissh06

sxissh061#

如果您看一下数据绑定引用是如何解决的,您可以看到,在决定如何公开要绑定到的属性时,可能需要考虑性能问题。
Model.Document是否实现了INotifyPropertyChanged接口?如果没有,我建议在视图模型中添加一个Title属性,并在视图模型中实现INotifyPropertyChanged,这样当Title被更改时,就会引发PropertyChanged事件来通知视图。
另一种方法是将视图模型上的Title公开为DependencyProperty,因为绑定和呈现时间更快。

qvtsj1bj

qvtsj1bj2#

这真的取决于你的情况。在最真实的意义上,视图应该只与视图模型交互。但是上面两种方法都有它们的优点。
通过公开Document属性,您不必复制需要访问它的所有属性。因此,如果您有许多属性,或者正在使用某种反射(例如在PropertyGrid中显示Document),那么这种方式可能更好。
后一种方法可以让你更好地控制暴露给View的值。因此,你可以在提交给模型或其他各种操作之前更改标题(即删除多余的空格)。你甚至可以在View不知道(甚至不关心)的情况下交换出Document。

apeeds0o

apeeds0o3#

您可以看看**WPF Application Framework (WAF)BookLibrary**示例应用,它使用第一种方法,仍然遵循MVVM模式(关注点分离,单元可测试)。
这简化了视图模型,因为绑定使用了实体的 INotifyPropertyChanged 实现。否则,您必须在视图模型之间手动同步更改。

5jvtdoz2

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

hec6srdp

hec6srdp5#

我不认为只读绑定到其值不改变的模型属性有任何问题。
不过,这是两个非常重要的条件。对模型属性的读/写绑定充满了潜在的麻烦,以至于我不会冷静地分析情况,看看这是否是没有任何属性的情况之一,而是在视图模型中实现一个属性并完成它。除非我的模型支持更改通知,如果我需要它,我可能会这样做,我需要在视图模型中实现它。

相关问题