- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
简介
我有一个在运行时导入实验室仪器数据的应用程序。此数据被导入,然后显示在 ListView
中在最终用户根据他或她的测试要求设置的时间间隔内。当感兴趣的值出现在此 ListView
中时他们观看,然后他们按下开始按钮,应用程序开始对该数据和后续数据执行计算,直到按下停止按钮。因此,屏幕左侧是一个 View ,用于显示导入的数据,右侧是另一个 View ,用于查看计算和显示的值和统计数据。
当前代码
显示导入数据的 ListView 的 View 是 ImportProcessView.xaml,它设置其 DataContext
到 ImportProcessViewModel.cs
.我刚刚介绍的 VM 有一个属性 ObservableCollection<IrData>
我刚才也描述过的 ListView 绑定(bind)到。现在到了有趣的部分......
ImportProcessView
有一个 ContentControl
动态设置其内容的 UserControl 表示特定于最终用户选择的阶段类型的控件和字段。
<StackPanel Background="White" Margin="5">
<ContentControl Content="{Binding CurrentPhaseView}"/>
</StackPanel>
一共有三个PhaseViews
,每个都有自己的用户控件,每个都设置为 DataContext
到 ImportProcessViewModel
.结果,我得到了一些严重的 VM 膨胀,达到 2000 行。荒谬的。我知道。膨胀的原因是因为 ImporProcessViewModel
通过三个 PhaseView 中的每一个的属性维护状态,不仅如此,还包含执行计算的方法,其数据存储和显示在这些“PhaseView”中。
我正在努力实现的目标
显然在 ImportProcessViewModel
之前变得更加笨拙,我需要将其分解,以便每个 PhaseView 都有自己的 ViewModel,而且每个 ViewModel 为了 IrData
的 ObservableCollection 强加的依赖关系而保持与 ImportProcessViewModel 的关系。 .
研发
我已经研究了 ViewModel 之间的相互通信,但是大多数 results涉及使用特定 MVVM 框架编写的应用程序。我没有使用框架,此时在项目中重构它以开始使用框架为时已晚。
不过,我确实找到了这个 article并且'hbarck'提供的答案建议一些简单的组合来实现我想要的结果,但由于我没有太多使用DataTemplates的经验,我不明白他/她建议公开“the UserControl 的 ViewModel 作为主 ViewModel 的属性,并将 ContentControl 绑定(bind)到该属性,然后通过 DataTemplate 实例化 View (即 UserControl)”
具体来说,我不明白“将 ContentControl 绑定(bind)到此属性,然后将通过 DataTemplate 实例化 View ”是什么意思。
有人可以通过代码示例阐明在此示例的上下文中通过 DataTemplate 实例化 View 的含义吗?
此外,这是一个好方法吗(如“hbarck”所建议的那样)?
如您所见,我已经将 ContentControl 的 Content 属性设置为要实例化的 Phase View。我只是不知道涉及 DataTemplate 会是什么样子。
最佳答案
I don't understand what is meant when he/she suggests exposing "the UserControl's ViewModel as a property on the main ViewModel, and bind a ContentControl to this property, which would then instantiate the View (i.e. the UserControl) through a DataTemplate"
DataTemplate
允许您指定 View (例如用户控件)和 View 模型之间的关系。
<DataTemplate DataType="{x:Type myApp:MyViewModel}">
<myApp:MyUserControl />
</DataTemplate>
只要 ContentPresenter
的内容属性设置为 MyViewModel
的实例,它就会显示 MyUserControl
。 View 模型将用作用户控件 DataContext
。通常,DataTemplate
会添加到您的应用程序资源中。
该答案的作者所说的是,您可以拥有一个 viewModel,该 viewModel 具有另一个 viewModel 类型的属性,该类型绑定(bind)到 ContentPresenter
的 Content
属性.
<ContentPresenter Content="{Binding ParentViewModel.ChildViewModelProperty}"/>
如果您有一个 DataTemplate
指定您的 ChildViewModel
和您的用户控件之间的关系,WPF 将自动将用户控件加载到您的 View 中。
This answer我提供给另一个问题可能也会为您提供一些帮助。
I need to break it up so that each PhaseView has its own ViewModel, but also such that each ViewModel maintains a relationship back to the ImportProcessViewModel.
这将允许您将 viewModel 分解为更小、更易于管理的 viewModel,它们会自行管理。这会给您留下 View 模型之间的通信问题。
如果您按照建议嵌套 viewModel,那么您的子 viewModel 可以公开父 viewModel 可以绑定(bind)到的事件,以便在发生变化时收到通知。像这样:
public class ParentViewModel // Derive from some viewModel base that implements INPC
{
public ParentViewModel()
{
childViewModel = new ChildViewModel();
childViewModel.SomeEvent += someEventHandler;
// Don't forget to un-subscribe from the event at some point...
}
private void SomeEventHandler(object sender, MyArgs args)
{
// Update your calculations from here...
}
}
这很简单,不需要任何额外的框架。有些人可能会反对这种方法,但它是一种有效的解决方案。缺点是 viewModel 必须了解彼此的存在才能订阅事件,因此最终会紧密耦合。不过,您可以使用标准的面向对象设计原则来解决这个问题(即从接口(interface)派生子 viewModel,以便父级只知道接口(interface)而不是实现)。
如果您真的想要松散耦合的通信,那么您需要使用某种事件聚合或消息总线系统。这类似于上面的方法,除了有一个对象位于 View 模型之间并充当中介,这样 View 模型就不必知道彼此的存在。我的answer here提供了更多信息。
有可用的预先存在的解决方案,但这将涉及采用额外的框架。我建议使用 Josh Smiths MVVM foundation因为它非常简单,无论如何您只需要使用一个类。
关于c# - 无需框架即可相互通信的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16403743/
这个问题已经有答案了: Resolve build errors due to circular dependency amongst classes (12 个回答) 已关闭 3 个月前。 如何允许
让 2 个 Swing 部件做同样的工作是很常见的。例如,我们可以在工具栏中使用一个 button 作为“保存”按钮,而 JMenuItem (文件保存...)也可以做同样的事情。 我的问题是: 有没
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我正在使用具有相互 SSL 安全性的 WCF 服务,我想检查一下我对何时使用什么证书的理解。 这是正确的吗? 客户端将客户端公共(public)证书交给服务器 服务器将服务器公共(public)证书交
假设您有一个相互 SSL 服务,除了 SSL 之外,它还有应用程序身份验证。因此,客户端提供证书(以及服务器),但客户端请求(例如 REST 请求)还包含后端应用程序服务器用于验证的用户名/密码。 就
有人让 Android uiautomator 可以同时在多个设备上运行,但做不同的事情吗? 我的意思是,我希望我的测试同时启动设备和应用程序,然后设备 A 执行设备 B 必须使用react的操作。这
我目前正在尝试在客户端和服务器之间实现双向 TLS 身份验证。我遇到了一个 SSL 错误,它的描述性不强。 StackOverflow 也没有太多与之相关的问题,因为大多数时候它是互联网上的单向 TL
这里是新手。我正在做我的第一个元素,我想为不同的人(普通人、 worker 、农民等)提供 slider ,但我不知道如何放置多个 slider 以及如何让它们全部工作。我从 W3schools 获取
我创建了一张翻转卡片,但卡片内的所有 div 似乎都浮在彼此之上。我希望 div 彼此相邻。 我看了很多问题,但似乎找不到答案。我尝试了多种显示:内联;职位:相对;向左飘浮;清除:两者;但我似乎无法让
我正在使用此控件来安排时间。我有一个单选按钮列表,然后是多个内容 Pane 。根据内容,我想在正确的控件中淡入淡出。但出于某种原因,在 div 上放置一个 float 并设置 z-index 并不能使
有什么方法可以解密双向 SSL(客户端和服务器,两种方式)? 我找到了这个链接:https://www.wireshark.org/lists/wireshark-users/201001/msg00
我正在开发一个 Web 应用程序,安全性是我们在此应用程序中的主要关注点之一。我正在查看不同的 API 安全方法(在 OWASP 中提到),无法理解相互 SSL 身份验证和基于 token 的身份验证
我正在尝试使用分配给 kube-dns 服务的集群 IP 从 dnstools pod ping kube-dns 服务。 ping 请求超时。在同一个 dnstools pod 中,我尝试使用暴露的
过去几天我一直在研究这个问题,但我一无所获。 场景是: 现场的 iOS 应用程序将调用我的 REST 服务 (.NET)。我的 REST 服务将使用相互 SSL 握手调用 Apache Web 服务。
我正在尝试向 java swing 应用程序添加 3 个 JSlider,以便三个 slider 的总值(value)总和为 100。每个 slider 都是一个概率, slider A 是将值添加到
我们正在使用 java 客户端(openJDK 1.8.0) 调用需要相互身份验证的 api。为此,我们使用 Java 标准 JKS 文件作为 keystore 和信任库(包含信任证书和身份证书/私钥
有人告诉我使用双向身份验证连接到客户的服务器。服务器身份验证工作顺利,但我们在获取客户端身份验证方面遇到了巨大的麻烦。让我试着解释一下我们的麻烦。 前段时间我公司在 GeoTrust 购买了一个证书,
正在试用 PAW 并且非常喜欢它。我唯一无法正常工作的是使用 HTTPS 相互身份验证。我需要与之交互的一些 API 需要相互验证的 https。 如何告诉 PAW 使用证书进行身份验证?该证书已经在
我们有一个在 Jboss EAP 5.1 中部署并使用 Spring 2.5 已经运行了一年多的 CXF webservice 我们现有的客户证书管理策略如下: 对于非 PROD,证书名为“NAME-
我正在创建一个将调用 API 的 Windows 服务。对于这个过程,我正在尝试建立相互(双向)SSL 身份验证。因为我是新手。我尝试实现一个简单的客户端和服务器项目,它们将相互进行身份验证。 我已经
我是一名优秀的程序员,十分优秀!