- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尽我所能尝试忠于 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);
}
}
user_control_in_xaml
是我必须在 GUI 的 XAML 中命名的 UserControl。
user_control_in_xaml
,因为这意味着如果设计师要重做 GUI,他必须知道调用这个方法——我认为这个想法是从 View 层隐藏模型细节,但我不知道如何做到这一点。
最佳答案
我自己是 MVVM 的新手,但这是一个可能的解决方案:
在您的 VM 中创建一个属于对象类型(控制硬件)的属性,并将其绑定(bind)到 UserControl 上的附加属性。然后,您可以使用依赖注入(inject)在 VM 中设置该属性,以便在创建 VM 时设置该属性。在我看来,与硬件(硬件 Controller )对话的类是一项服务。该服务可以注入(inject)您的 View 模型并绑定(bind)到您的用户控件。我不确定这是否是最好的方法,以及它是否对所有 MVVM 原则都足够严格,但它似乎是一个可能的解决方案。
关于c# - 无法决定如何将 UserControl 与 MVVM 连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3238478/
这是一道函数依赖题。 我知道当 x->yz 然后 x->y 和 x->z 时。但是上面的依赖关系可能吗? 最佳答案 If xy determines z can x determine z and y
我有一个奇怪的问题。 Line 61: $this->_currentRoute = Default_Model_Routes::getInstance()->getCurrentRoute(); .
我正在开发一种工具来比较两个波形文件的波形相似性。例如,我有一个持续时间为 1 分钟的波形文件,我使用第一个波形文件制作了另一个波形文件,但每 5 秒生成一次数据,间隔为 5 秒至 0。 现在我的软件
我遇到了一个奇怪的问题,尽管我打赌有一个巧妙的方法可以解决它。 情况是我有一个具有三列排序状态的表:完全未排序,在这种情况下我不希望出现任何图标,按升序排序,在这种情况下我想要一个向上箭头,以及按降序
Java 语言规范提供了criteria用于确定(格式良好的)执行是否满足“Java 内存模型的因果关系要求”。让我们假设执行是有限的。我试图了解是否存在多项式时间算法来证明或反驳这种情况。 真的,我
Java 语言规范提供了criteria用于确定(格式良好的)执行是否满足“Java 内存模型的因果关系要求”。让我们假设执行是有限的。我试图了解是否存在多项式时间算法来证明或反驳这种情况。 真的,我
我正在编写一个简单的Bank类,其中包含Account。我希望人员能够开设一个新的受密码保护的银行帐户,并从其帐户中提取和存入资金。账户设在银行内。银行和帐户类应提供哪些服务? 假设 p 已在银行 b
我的标题概括了这一点。我有一个将要开发的简单业务线应用程序,并且很好奇如何确定我应该针对哪个 .NET 版本。支持 Win XP SP3 会很好,但不是必需的。它将用于索引多页 tiff,因此导入一批
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 你是否真的“尝试过”(意味着在其中编程,而不仅仅是阅读有关它的文章)Erlang并决定在项目中
我正在尝试使用 ExceptionFilterAttribute 为 Web Api 实现异常处理。我已经继承了ExceptionFilterAttribute 类并覆盖了onException 方法
前一段时间在一次编程比赛中我遇到了一个令人费解的问题,此后一直困扰着我。虽然我没有逐字记住,但我会尽力重现: Jack starts at 0 on the number line and jumps
我有什么: 我有一个主要内容区域,后面跟着两个旁白: #primary,#secondary,#tertiary{float:left; width:33%;} Primary
我无法正确操作键盘。 整个 View 充满了文本字段。 当我使用通知将 View 向上移动时,上方的文本框不再可见: override func viewDidLoad() { super.v
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我在尝试获取父对象来过滤子事件时遇到问题。 在下面的示例中,我在旋转框上设置了一个事件过滤器。事件过滤器检测旋转框上的鼠标按下事件。然后,我希望父对象根据某些标准接受或忽略该事件。 问题是它似乎接受了
我使用从 std::system_error 继承的类进行错误处理,我想控制调用 what() 时返回的内容。原因:标准(C++11 和 C++1y CD 草案 - N3690,下面的 § 引用是后者
我正在用 Swift 构建一个 iOS 应用程序,它的起始页有 6 个按钮。这些按钮中的每一个都将连接到一个 TableView Controller ,其数据由 NSFetchedResultsCo
我想构建这样的东西 数据存储| mycode.py | RESTful API | mywebapp.py(Django 或 Tornado) 我检查了 Django 的 Piston,但似乎这样我就
究竟如何更改 RichTextBox 中的字体? 环顾四周给了我似乎不再有效的旧答案。我认为这就像执行 richtextbox1.Font = Font.Bold; 或类似操作一样简单。原来不是,所以
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!