问题标签 [mvvm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2241 浏览

wpf - MV-VM - 在 ViewModel 中使用命令的任何示例?

我一直在使用我称之为 MV-MC (Model-View-ModelController) 的 MV-VM 风格开发一个非常大的 LOB 应用程序,它是 MVC 和 MV-VM 的一种组合。我已经发布了这个关于视图如何在 MV-VM 中实例化到问题“ what-are-the-most-common-mistakes-made-in-wpf-development ”的答案。

Sam对我的回答发表了以下评论:

这就产生了一个后续问题:您如何创建视图?我使用 RelayCommands 将视图中的动作绑定到 ViewModel,因此视图甚至不知道动作已经触发,也不知道他应该打开一个新视图。解决方案:在VM中创建一个事件供View订阅?

当我最初开始 MV-VM 开发时,我认为一切都应该存在于 ViewModel 中,并且研究了Josh SmithKarl Shifflett等人的大量示例。但是,我还没有想出一个很好的例子来说明命令何时需要存在于 ViewModel 中。

例如,假设我有一个显示客户的 ListView,以及一个单击以允许我编辑当前选择的客户的按钮。ListView (View) 绑定到 CustomerVM (ViewModel)。单击该按钮会触发 EditCustomerCommand,它会打开一个弹出窗口,允许我编辑 CustomerVM 的所有属性。这个 EditCustomerCommand 在哪里?如果它涉及打开一个窗口(UI 功能),它不应该在视图的代码隐藏中定义吗? 替代文字

有没有人有任何我应该在 View 和 ViewModel 中定义命令的示例?

马修赖特在下面陈述:

从列表中新建和删除将是很好的例子。在这些情况下,ViewModel 会添加一条空白记录或删除当前记录。视图采取的任何行动都应响应发生的这些事件。

所以如果我点击新按钮,会发生什么?CustomerVM 的新实例由 Parent ViewModel 创建并添加到它的集合中,对吗?那么如何打开我的编辑屏幕呢?视图应该创建 Customer ViewModel 的新实例,并将其传递给 ParentVM.Add(newlyCreatedVM) 方法,对吗?

假设我通过虚拟机上的 DeleteCommand 删除客户记录。VM 调用业务层并尝试删除记录。它不能,所以它会向虚拟机返回一条消息。我想在对话框中显示此消息。视图如何从命令操作中获取消息?

0 投票
9 回答
20034 浏览

wpf - WPF MV-VM:从 ListCollectionView 中获取选定的项目?

我有一个使用 Model-View-ViewModel 模式的 WPF 应用程序。
在我的 ViewModel 中,我有一个 ListCollectionView 来保存项目列表。
此 ListCollectionView 绑定到我的视图中的 ListBox。

ListBox 具有 SelectionMode=Multiple,因此您可以一次选择多个项目。现在 ViewModel 需要知道哪些项目已被选中。

问题是:在 View-Model-ViewModel 模式中,ViewModel 无法访问 View,所以我不能只询问 ListBox 哪些项目已被选中。我所拥有的只是 ListCollectionView,但我无法找到一种方法来查找其中已选择哪些项目。

那么如何找到 ListBox 中选择了哪些项目呢?或者实现这一点的技巧(也许将某些东西绑定到我的项目中的布尔“IsSelected”?但是什么?如何?)

也许使用这种模式的人也可以在这里帮助我?

0 投票
23 回答
125156 浏览

.net - 使用 MVVM 处理 WPF 中的对话框

在 WPF 的 MVVM 模式中,处理对话框是更复杂的操作之一。由于您的视图模型对视图一无所知,因此对话通信可能很有趣。我可以公开一个ICommand,当视图调用它时,会出现一个对话框。

有谁知道处理对话结果的好方法?我说的是 Windows 对话框,例如MessageBox.

我们这样做的一种方法是在视图模型上设置一个事件,当需要对话框时视图将订阅该事件。

这没关系,但这意味着视图需要代码,这是我想远离的。

0 投票
1 回答
901 浏览

silverlight - Silverlight 和多个视图模型

我正在使用 MVVM 模式编写 Silverlight 应用程序。我有一个主视图(UserList.xaml)和相应的虚拟机(UserListViewModel.cs)。这用于列出用户的集合。我还有一个 UserControl(User.xaml - 作为模式对话框调用),用于为新用户添加详细信息。这也有它自己的视图模型(UserViewModel.cs)。

我的问题是,一旦子视图被关闭,您如何将信息(用户对象)从子视图模型传回父视图?当我对子视图模型进行保存时,我需要更新父视图模型中的集合。应该足够简单,但父视图模型不知道孩子何时被解雇。即使 UserViewModel.User 属性发生更改并且引发了 PropertyChanged 事件,UserListViewModel 也不会意识到这一点。

非常感谢这里的任何帮助。我已经阅读了 Silverlight 中有关 mvvm 的所有内容,但仍存在一些差距。我希望我已经清楚地概述了我的问题。

0 投票
2 回答
4512 浏览

.net - 实现和使用 ICommand 接口,MVVM

尽管我深深地爱上了 MVVM 模式,但似乎有很多问题我(还)无法自己解决。

我想知道 IComamnd 接口的方法的参数有什么用

例如void Execute(object parameter);

我像这样将我的视图与视图模型联系起来

所以“ parameter”将永远为空。

欢迎任何提示。

谢谢!

更新: 该死,在我发布这个问题一分钟后,我在Stackoverflow上找到了答案。显然控件确实有一个 CommandParameter 属性。

0 投票
25 回答
111170 浏览

c# - ViewModel 应该如何关闭表单?

我正在尝试学习 WPF 和 MVVM 问题,但遇到了障碍。这个问题与这个问题相似但不完全相同(handling-dialogs-in-wpf-with-mvvm) ......

我有一个使用 MVVM 模式编写的“登录”表单。

此表单有一个 ViewModel,其中包含用户名和密码,它们使用普通数据绑定绑定到 XAML 中的视图。它还有一个“登录”命令,该命令绑定到表单上的“登录”按钮,同样使用普通数据绑定。

当“Login”命令触发时,它会调用 ViewModel 中的一个函数,该函数会关闭并通过网络发送数据以进行登录。此函数完成后,有 2 个操作:

  1. 登录无效 - 我们只显示一个 MessageBox,一切都很好

  2. 登录是有效的,我们需要关闭登录表单并让它返回 true 作为它的DialogResult...

问题是,ViewModel 对实际视图一无所知,那么它如何关闭视图并告诉它返回特定的 DialogResult?我可以在 CodeBehind 中粘贴一些代码,和/或将 View 传递给 ViewModel,但这似乎会完全破坏 MVVM 的全部意义......


更新

最后,我只是违反了 MVVM 模式的“纯粹性”,让 View 发布了一个Closed事件,并公开了一个Close方法。然后 ViewModel 将调用view.Close. 视图只能通过接口知道并通过 IOC 容器连接,因此不会丢失可测试性或可维护性。

接受的答案是-5票似乎很愚蠢!虽然我很清楚一个人在“纯洁”的同时解决问题所获得的良好感觉,当然我不是唯一一个认为 200 行事件、命令和行为只是为了避免单行方法的人“模式”和“纯度”的名称有点可笑....

0 投票
8 回答
7267 浏览

wpf - 在 WPF 中实现 MVVM 而不使用 System.Windows.Input.ICommand

我正在尝试使用 MVVM (Model-View-ViewModel) 模式实现 WPF 应用程序,并且我希望将 View 部分与 Model 和 ViewModel 部分(一个 DLL)放在一个单独的程序集(一个 EXE)中。

这里的转折是保持模型/视图模型程序集清除任何 WPF 依赖项。这样做的原因是我想从具有不同(非 WPF)UI 技术的可执行文件中重用它,例如 Mono 下的 WinForms 或 GTK#。

默认情况下,这是无法做到的,因为 ViewModel 公开了一个或多个 ICommand。但是 ICommand 类型是在 System.Windows.Input 命名空间中定义的,属于 WPF!

那么,有没有不使用 ICommand 来满足 WPF 绑定机制的方法呢?

谢谢!

0 投票
4 回答
1744 浏览

wpf - 如何在 MVVM 模式中保持模型和视图模型之间的一致性?

问题陈述

我正在编写一个非常基本的 WPF 应用程序来更改配置文件的内容。数据格式是带有架构的 XML 文件。我想把它作为一个MVVM的学习项目,所以我把代码适当的分成

  • 模型:从 xsd.exe 自动生成的 C# 类

  • View-Model:模型的视图友好表示。

  • 查看:Xaml 和后面的空代码

我了解 View-Model 如何使 View-binding 变得轻而易举。但是,这不是让 View-Model <-> Model 语义非常尴尬吗?Xsd.exe 为多个 XML 元素生成带有数组的 C# 类。但是,在 V-VM 级别,您需要 Observable Collections。

问题:

这真的意味着我必须保持两个完全不同的集合类型一致地表示相同的数据吗?

保持模型和视图模型之间一致性的最佳实践是什么?

0 投票
2 回答
2480 浏览

silverlight - Silverlight MVVM 应用程序中服务定位器的用途是什么?

我正在尝试为我的 MVVM Silverlight 应用程序整合所有部分,并且我看到一些博客涉及服务定位器。

什么是服务定位器,什么时候应该使用它?

0 投票
2 回答
804 浏览

wpf - 如何在按钮的 CommandParam 中传递特定的视图模型对象?

我有一个使用 Master-Detail UI 模式的简单 WPF 程序,其中 Detail 显示主窗格中当前选择的集合项。我正在使用 MVVM,每个 XAML 页面都由一个 ViewModel 对象支持,该对象设置为它的 DataContext。

现在,我想在主窗格中添加一个删除按钮以从主项目列表中删除。但是,我不知道如何将当前选定项的视图模型对象作为按钮 CommandParameter 传递给路由命令处理程序代码。

在此先感谢您的任何指点。

麦克风