自定义DependencyProperty具有模型类型和自动创建ViewModel

时间:2013-04-17 09:52:22

标签: wpf mvvm viewmodel dependency-properties

我有一个模型的自定义DP(DependencyProperty)。我的意思是DP的类型与模型的类型相同。

如果我将模型设置为DP,只要视图可以使用模型属性,一切都很好。

现在我来到了需要引入ViewModel并且不想更改DP类型的地步。 ViewModel应该是View用户的隐藏实现细节。 View的用户应绑定Model而不是ViewModel。通过注册PropertyChangedEvent(在DP注册上)并在事件处理程序中直接设置内部控件的DataContext,我已经在很多地方完成了这项工作。

因为在我看来这是常见的操作,我想我是以蹩脚的方式做的。当DP绑定模型更改并在视图中绑定它时,是否有更简洁,更优雅的方法来创建ViewModel?

1 个答案:

答案 0 :(得分:1)

是的,正如您在评论中提到的那样,您不需要DP来保存模型或ViewModel,并且通常您会尝试避免编码到这种情况,除非某些边缘情况因任何原因而要求它。使用DP扩展Control / View的功能,而不是存储Model或ViewModel。

这是我通常遵循的逻辑:

想象一下,我们有一个模型:MyModel,视图:ParentView,Child1View,Child2View

  • 每个视图有1个VM。因此,我们有3个VM的ParentViewModel,Child1ViewModel,...
  • 让其中的父视图资源声明DataTemplate DataType个孩子ViewModel以及Content DataTemplate对应的子视图。

示例:

<DataTemplate DataType="{x:Type local:Child1ViewModel}">
  <local:Child1View />
</DataTemplate>
  • 现在在ParentView中将DataContext设置为local:ParentViewModel
  • 在ParentViewModel中创建一个Property(CurrentViewModel)来保存ChildModel。我使用MVVM Light,因此我的属性类型通常是ViewModelBase,我的所有ViewMode都是。
  • 在ParentView中,将ContentControl的内容相应地绑定到此属性

示例:

<ContentControl Content="{Binding CurrentViewModel}" />

现在只需在ParentViewModel中切换此属性,您的ContentControl就会相应更新,而您根本不需要添加任何DP。

现在,如果MyModel实现了INPC本身,那么在MVVM Light中可以通过使你的模型继承自ObservableObject来实现(尽量不要使用ViewModelBase作为模型的基类。这只会令人困惑并增加混乱),您可以在ViewModel的

中将模型公开为属性(ModelProperty)

因此,在每个相应的View中直接绑定到Model,你所做的就像是

<TextBlock Text="{Binding ModelProperty.TextBlockText}" />

现在因为模型实现了INPC,如果在模型中进行了更改,则更改将自动反映在视图中。

就是这样,坐下来看看你的应用程序在今后相应部分添加功能时不断发展

请注意,除此之外,如果您使用Unity这样的东西,您可以获得依赖注入和排序,这可以在您的应用程序增长时进一步简化生活