1

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

如果我给DP设置了一个Model,只要视图可以使用Model属性,一切都很好。

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

在我看来,这似乎是一种常见的操作,我认为我这样做是一种蹩脚的方式。当 DP 绑定的 Model 发生变化并将其绑定到 View 中时,是否有更精简、更优雅的方式来创建 ViewModel?

4

1 回答 1

1

是的,正如您在评论中提到的那样,您不需要 DP 来保存模型或视图模型,通常您会尽量避免在这种情况下编码,除非某些边缘情况出于任何原因需要它。使用 DP 来扩展控件/视图的功能,而不是存储模型或视图模型。

这是我通常遵循的逻辑:

假设我们有一个模型:MyModel,视图:ParentView、Child1View、Child2View

  • 每个视图有 1 个虚拟机。因此我们有 3 个 VM 的 ParentViewModel、Child1ViewModel、...
  • 在它的资源中声明父视图的DataTemplateDataType视图ViewModel及其对应ContentDataTemplate子视图。

例子:

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

例子:

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

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

现在,如果 MyModel 实现 INPC 本身,在 MVVM Light 中可以通过让您的模型继承自ObservableObject(尽量不要ViewModelBase用作模型的基类。这只会令人困惑并增加混乱),您可以将模型公开为属性(ModelProperty ) 在您的 ViewModel 中

因此,在每个相应的视图中直接绑定到模型,你要做的就是像

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

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

就是这样,以后在相应部分添加功能时,请坐下来观察您的应用程序的发展

请注意,除此之外,如果您使用 Unity 之类的东西,您会获得依赖注入和排序,当您的应用程序增长时,这会进一步使生活变得更加轻松

于 2013-04-17T13:17:11.243 回答