【问题标题】:How can I pass in parameters from one to another ViewModel for its View to use?如何将参数从一个 ViewModel 传递到另一个 ViewModel 以供其 View 使用?
【发布时间】:2023-02-11 14:05:34
【问题描述】:

我有一个应用程序应该根据从 ViewModel 调用收到的参数变量显示数据。

我注意到调用 ViewModel 的两个地方,一个是父 ViewModel 的预期调用,用于在 ViewLocator.cs 的帮助下显示子 ViewModel 的视图。另一个是视图启用数据绑定所需的DataContext

前者:[ParentViewModel.cs]

public ParentViewModel()
{
    UserControlContent = new ChildViewModel(genericParameter: "actual parameter");
}

后者:[ChildView.axaml.cs]

public ChildView()
{
    InitializeComponent();
    DataContext = new ChildViewModel(genericParameter: "not the parameter I want");
}

所以我想传入 "actual parameter",如上所示,以便在结果视图中显示。我希望最终视图看起来像这样:

但实际上我明白了:

那么,我该如何解决这个问题并让视图显示正确的数据呢?

感谢任何输入!

【问题讨论】:

    标签: c# user-interface mvvm avaloniaui avalonia


    【解决方案1】:

    事实证明,只需要来自 ParentViewModel 的调用。 ChildView下的DataContext可以去掉,使用正确的参数即可。

    感谢here 对这个问题的回答。

    【讨论】:

      【解决方案2】:

      我认为您对 MVVM 有一些根本性的误解。

      首先,您有两个 ChildViewModel 实例。

      因此,在 ParentViewModel 中对视图模型的 UserControlContent 实例进行的调用将永远不会反映在 UI 中,因为 ChildView 创建了 ChildViewModel 本身的新实例,然后将此实例用于 @987654326 @.

      您应该使用某种形式的 IoC 和 DI 您的依赖项。

      MVVM 不鼓励通过 new 关键字使用手动创建视图模型。

      除非有非常具体的用例,否则尽量保持 UI 结构和视图模型之间的某种关系尽可能平坦。

      我的意思是,如果有一个用例,其中父视图模型需要与子视图模式相同的东西。展平和合并这两个视图模型可能是有意义的。

      这反过来又简化了 VM 本身和绑定。

      【讨论】:

        猜你喜欢
        • 2022-11-25
        • 1970-01-01
        • 1970-01-01
        • 2012-09-07
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多