我有一个模型的自定义DP(DependencyProperty
)。我的意思是DP的类型与模型的类型相同。
如果我将模型设置为DP,只要视图可以使用模型属性,一切都很好。
现在我来到了需要引入ViewModel并且不想更改DP类型的地步。 ViewModel应该是View用户的隐藏实现细节。 View的用户应绑定Model而不是ViewModel。通过注册PropertyChangedEvent(在DP注册上)并在事件处理程序中直接设置内部控件的DataContext
,我已经在很多地方完成了这项工作。
因为在我看来这是常见的操作,我想我是以蹩脚的方式做的。当DP绑定模型更改并在视图中绑定它时,是否有更简洁,更优雅的方法来创建ViewModel?
答案 0 :(得分:1)
是的,正如您在评论中提到的那样,您不需要DP来保存模型或ViewModel,并且通常您会尝试避免编码到这种情况,除非某些边缘情况因任何原因而要求它。使用DP扩展Control / View的功能,而不是存储Model或ViewModel。
这是我通常遵循的逻辑:
想象一下,我们有一个模型:MyModel,视图:ParentView,Child1View,Child2View
DataTemplate
DataType
个孩子ViewModel
以及Content
DataTemplate
对应的子视图。 示例:
<DataTemplate DataType="{x:Type local:Child1ViewModel}">
<local:Child1View />
</DataTemplate>
DataContext
设置为local:ParentViewModel
ViewModelBase
,我的所有ViewMode都是。 示例:
<ContentControl Content="{Binding CurrentViewModel}" />
现在只需在ParentViewModel中切换此属性,您的ContentControl
就会相应更新,而您根本不需要添加任何DP。
现在,如果MyModel实现了INPC本身,那么在MVVM Light中可以通过使你的模型继承自ObservableObject
来实现(尽量不要使用ViewModelBase
作为模型的基类。这只会令人困惑并增加混乱),您可以在ViewModel的
因此,在每个相应的View中直接绑定到Model,你所做的就像是
<TextBlock Text="{Binding ModelProperty.TextBlockText}" />
现在因为模型实现了INPC,如果在模型中进行了更改,则更改将自动反映在视图中。
就是这样,坐下来看看你的应用程序在今后相应部分添加功能时不断发展
请注意,除此之外,如果您使用Unity这样的东西,您可以获得依赖注入和排序,这可以在您的应用程序增长时进一步简化生活