gpt4 book ai didi

c# - 无法决定如何将 UserControl 与 MVVM 连接起来

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

我一直在尽我所能尝试忠于 MVVM 模式推荐的分离。我还没有弄清楚如何正确做的一件事与初始化我的用户控件有关。

我最近的一个例子与我编写的用于与一些低级硬件通信的库有关。该程序集恰好有一个 UserControl,我可以简单地将其放入使用该硬件的任何 GUI 中。它工作所需要的只是设置对可以访问低级方法的对象的引用。

但是,这就是我的问题所在 - 目前,UserControl 通过 XAML 添加到 GUI,我在其中定义命名空间,然后将 UserControl 添加到我的窗口。当然,此时我无法控制它的创建,因此会调用默认构造函数。为硬件控制设置必要引用的唯一方法是调用 UC 中的方法来执行此操作。 ViewModel 可以调用模型中的方法,例如GetController() ,然后调用 UserControl 中的方法相应地设置引用。当 GUI 创建 ViewModel 时,GUI 可以将对 UserControl 的引用传递给 ViewModel,但这违反了 MVVM,因为 ViewModel 不应该知道有关此控件的任何信息。

我可以处理此问题的另一种方法是不在 XAML 中创建 UserControl,而是从代码隐藏中完成所有操作。在 ViewModel 初始化并检索一个初始化的 UserControl(即具有低级对象引用集的用户控件)之后,它可以将我的 Window 的内容设置为 UserControl。然而,这也违反了 MVVM——有没有办法将 Window、TabControl 或任何其他元素的内容数据绑定(bind)到 UserControl?

我想知道是否有人以前必须处理过这个问题,以及他们是否以我在这里概述的第一种或第二种方式来处理它,或者他们是否采取了完全不同的方法。如果我在这里问的内容不清楚,请告诉我,我会尽力更新更多信息、图表等。

更新

谢谢大家的回复,但我一定没有很好地解释这个问题。当用户单击 UserControl 本身的控件时,我已经在 UserControl 的 ViewModel 中使用 RelayCommands 来处理对硬件层(模型)的所有调用。我的问题与最初传递对 UserControl 的引用有关,因此它可以与硬件层通信。

如果我直接在 XAML 中创建 UserControl,那么我不能通过构造函数将这个引用传递给它,因为我只能使用默认构造函数。我现在采用的解决方案看起来不兼容 MVVM——我必须在 XAML 中命名 UserControl,然后在代码隐藏(即 View )中,我必须调用我添加的方法能够设置此引用。例如,我有一个 GUI UserControl,其中包含我的硬件的诊断 UserControl:

partial class GUI : UserControl
{
private MainViewModel ViewModel { get; set; }

public GUI( Model.MainModel model)
{
InitializeComponent();
ViewModel = new MainViewModel( model, this.Dispatcher);
ViewModel.Initialize();
this.DataContext = ViewModel;
diagnostics_toolbar.SetViewModel( ViewModel);
user_control_in_xaml.SetHardwareConnection( model.Connection);
}
}

其中外部类是主 GUI 用户控件, user_control_in_xaml是我必须在 GUI 的 XAML 中命名的 UserControl。

再看一遍,我意识到使用命名方法可能没问题,因为它都在 View 本身中使用。我不确定是否将模型信息传递给 user_control_in_xaml ,因为这意味着如果设计师要重做 GUI,他必须知道调用这个方法——我认为这个想法是从 View 层隐藏模型细节,但我不知道如何做到这一点。

您还会注意到主 GUI 在构造函数中传递了模型,我认为这同样糟糕。也许我需要重新审视设计,看看是否可以让 ViewModel 创建模型,这是我通常做的,但在这种情况下,我不记得为什么我必须在 GUI 之外创建它。

最佳答案

我自己是 MVVM 的新手,但这是一个可能的解决方案:

在您的 VM 中创建一个属于对象类型(控制硬件)的属性,并将其绑定(bind)到 UserControl 上的附加属性。然后,您可以使用依赖注入(inject)在 VM 中设置该属性,以便在创建 VM 时设置该属性。在我看来,与硬件(硬件 Controller )对话的类是一项服务。该服务可以注入(inject)您的 View 模型并绑定(bind)到您的用户控件。我不确定这是否是最好的方法,以及它是否对所有 MVVM 原则都足够严格,但它似乎是一个可能的解决方案。

关于c# - 无法决定如何将 UserControl 与 MVVM 连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3238478/

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