gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:38:17 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

这是我通常遵循的逻辑:

想象一下,我们有一个 型号 :我的模型,浏览量 : 父 View 、子 1 View 、子 2 View

  • 每个 View 有 1 个虚拟机。因此我们有 3 个 VM 的 ParentViewModel, Child1ViewModel, ...
  • 在其资源中声明父 View DataTemplateDataType child ViewModel的和 ContentDataTemplate它是相应的 subview 。

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

  • 例子:
    <ContentControl Content="{Binding CurrentViewModel}" />

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

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

    因此,在每个相应的 View 中直接绑定(bind)到模型,你要做的就是像
    <TextBlock Text="{Binding ModelProperty.TextBlockText}" />

    现在因为模型实现了 INPC,如果在模型中进行更改,将自动反射(reflect)在 View 中。

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

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

    关于wpf - 具有模型类型和自动创建 ViewModel 的自定义 DependencyProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056927/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com