是的,正如您在评论中提到的那样,您不需要 DP 来保存模型或视图模型,通常您会尽量避免在这种情况下编码,除非某些边缘情况出于任何原因需要它。使用 DP 来扩展控件/视图的功能,而不是存储模型或视图模型。
这是我通常遵循的逻辑:
假设我们有一个模型:MyModel,视图:ParentView、Child1View、Child2View
- 每个视图有 1 个虚拟机。因此我们有 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
是我所有 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 之类的东西,您会获得依赖注入和排序,当您的应用程序增长时,这会进一步使生活变得更加轻松