问题标签 [simple-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 投票
2 回答
417 浏览

wpf - 视图分层且需要换入换出时定位 ViewModel 的策略

假设我正在为汽车构建导航系统:

  • 主窗口将包含一个屏幕、模式按钮和一个音量控制。
  • 根据系统的模式,屏幕将显示音频、气候或导航面板。
  • 在音频模式下,会有另一组模式按钮和一个面板,可以显示收音机、CD 或 MP3 控件。

过去,我对此类安排的策略是让我的视图模型遵循与视图完全相同的层次结构。所以:

  • MainViewModel 将有一个 ScreenViewModel。
  • ScreenViewModel 将具有 AudioViewModel、ClimateViewModel 和 NavigationViewModel。它还有一个 CurrentViewModel 属性,可以设置为音频、气候或导航视图模型,具体取决于系统模式。
  • AudioViewModel 类似于 ScreenViewModel,为每个音频系统的模式(收音机、CD 和 MP3)保存视图模型以及用于存储当前模式的视图模型的属性。

用于将视图绑定到视图模型的 XAML 如下所示:

如果用户正在收听广播并决定在导航系统中输入目的地,他们将单击导航模式按钮。MainWindowViewModel 上会有一个命令将系统模式更改为“导航”并将 CurrentViewModel 设置为 NavigationViewModel。这将导致 NavigationView 被交换。非常干净的解决方案。

不幸的是,虽然以这种方式在执行模式下运行良好,但在尝试使用 Expression Blend 中的从属视图(例如 AudioPanel)时它会崩溃,因为父视图模型 (MainWindowViewModel) 不存在以提供 AudioViewModel。

似乎在 MVVM Light 和 Simple MVVM 等工具包中支持的解决方案是使用 ViewModelLocator,然后通过绑定到定位器上的正确属性让视图设置它自己的 DataContext。然后定位器提供视图模型的一个实例。

“ViewModelLocator 做事方式”解决了“可设计性”问题,但我不清楚如何表示层次关系并处理一个视图与另一个视图的交换。从概念上讲,让视图模型保存子视图模型对我来说更有意义。它正确地表示了视图的层次结构,视图的交换很容易,如果不再需要视图,则只需删除对父视图的引用,关联的视图模型及其所有下属都将被垃圾收集。

问题

构建 ViewModelLocator 以处理分层视图、基于系统模式交换视图和删除视图的最佳实践是什么?

具体来说:

  • 您如何组织视图模型以便清楚地表示层次关系?
  • 您如何处理将一个现有视图换成另一个视图(例如用导航面板替换音频面板)?
  • 当不再需要关联的父视图时,如何确保释放父视图模型和子视图模型以进行垃圾回收?
0 投票
2 回答
705 浏览

data-binding - 我的组合框选定值绑定不会在双向数据绑定中回流

我使用简单的 MVVM 框架来创建一个简单的 Silverlight 4.0 LOB 应用程序。

我有一个员工列表视图,其中显示了所有员工的列表,并且我的 EmployeeListViewModel 中有一些属性如下:

现在在我看来,我有一个按钮可以在我的员工列表中编辑选定的员工,它会打开一个新的子窗口,其中包含要编辑的 EmployeeDetails

这是编辑员工方法

现在在我的详细信息子视图中我有这个承包商

这是我的 DetailsViewModel 构造器

毕竟现在是绑定我有部门,宗教和等级的三个组合框(这是我的员工表中的外键)

等等..问题是当我更改其值时,只有部门组合框正在更新源值

并且其他组合框不会..即使绑定语句完全相同!

很抱歉写了这么多..但是有人可以帮我吗?

多谢

0 投票
2 回答
27639 浏览

java - java中的MVVM模式

我想mvvm在java上做一个项目。但我找不到示例项目。有一些 Android 示例,但我不想制作 Android 项目。那么如何使用该mvvm模式制作项目呢?

我正在尝试创建一个包含组合框和数据网格的桌面应用程序。应用程序必须连接到数据库(即 MySQL)并且数据网格必须填充数据。组合框上的任何更改都必须更改网格的内容。也许我想CRUD在后面的步骤中进行操作。

所以有什么建议...

0 投票
1 回答
440 浏览

wpf - MVVM 单元测试 - 消息总线只工作一次

我正在尝试使用 SimpleMvvmToolkit 针对视图模型编写一些单元测试,其中一些测试需要将消息发送到消息总线以触发视图模型内的事件。问题是我似乎只能“使用”一次消息总线;发送消息的第一个测试通过,但发送消息的另外两个测试失败。但是如果我单独运行每个测试,所有三个都通过,如果我改变顺序,第一个测试,无论是哪一个,都会通过。

这是其中一项测试的示例。

所以我正在创建一个服务的模拟(它是 WCF 服务的包装器)并验证服务上的 DeleteValidatonRequest 是否被调用。在这种情况下,需要消息总线,因为如果用户单击确定,通常会弹出一个确认对话框并发送 DeleteValidationRequestConfirmation 消息。

测试在最后一行(验证)失败,当我调试时,视图模型中消息的处理程序永远不会执行,因此看起来消息从未真正发送过。同样,仅当测试不是向总线发送消息的第一个测试时才会失败。如果它单独执行或者是第一个执行,则测试通过。

有任何想法吗?所有测试都是独立的,并且不共享测试类的任何属性或变量,所以我看不出它们如何相互踩踏。

编辑:我使用反射调用消息通常会触发的视图模型上的受保护方法;这得到了我想要的代码覆盖率,它只是没有验证视图模型是否正确响应消息。

编辑 2:废话,视图模型上的 PropertyChanged 事件也发生了同样的事情。事件处理程序仅在测试独立运行或第一个运行时触发。

0 投票
3 回答
951 浏览

c# - 属性设置器是否可以对 MVVM 模式产生副作用

我正在编写旨在解决标准问题的 WPF 应用程序。我对 WPF 和 MVVM 模式真的很陌生,所以在阅读了互联网上大量不同的 MVVM 方法后,我的脑子里有些混乱。我想知道我对 DataGrid 的 itemsource 刷新操作的简单操作对 MVVM 来说是“惯用的”。

假设我有一个数据网格和一个组合框。该组合包含所有教练的列表。数据网格向您显示由选定教练训练的所有运动员,因此该组合就像数据网格中数据的过滤器:

我的 ViewModel 类在 SelectedCoach 属性的设置器中更改 DataGrid 的内容(此属性是 Combobox 值的目标):

这样的代码没有味道吗?或者订阅 SelectedCoach 属性的更改并在单独的函数中设置 ListSportsman 会更合适?(顺便问一下,如何手动订阅 NotifyPropertyChanged 事件?)

0 投票
1 回答
366 浏览

wpf - WPF - 在 SimpleMVVM 消息总线执行的代码中捕获异常

我正在使用SimpleMVVM 框架构建 WPF 应用程序,但无法捕获异常。我使用 SimpleMVVM 的 MessageBus 将消息发送到另一个视图模型。这一切都很好,但我注意到消息总线执行的代码中引发的异常被抑制了。这是我到目前为止所得到的:

My包含一个在 MainWindowViewModel 上MainWindow触发 a 的按钮。TempCommand该命令依次调用Test方法(如下所示),该方法使用 SimpleMVVM 的 MessageBus 发送通知消息。

我的MainWindow还包含一个Frame内容。此内容的 ViewModelCustomerViewModel已在其构造函数中注册以接收这些通知:

Temp方法只是抛出异常的地方:

当我调试应用程序时,我清楚地看到Temp正在调用的方法和引发的异常。但由于某种原因,仅此而已。应用程序不受影响,我的异常捕获代码不知道该异常。

我以两种方式捕获异常。首先是通过处理以下事件Dispatcher

代码隐藏的地方如下:

此代码捕获一些异常,但不是全部。我发现 WPF 默认情况下会抑制数据绑定异常。因为我的 ViewModel 是通过DataContext我的视图上的属性来限制的,所以我认为这就是问题所在。我找到了这篇文章,它定义了一个TraceListener使用PresentationTraceSources该类的。数据绑定异常现在被捕获,但是......不是通过 MessageBus 执行的代码中抛出的异常。

我创建了一个演示此行为的解决方案,可以在此处下载。

这就是我卡住的地方。我错过了什么?我如何捕捉这些异常?

提前非常感谢。

J.P

0 投票
2 回答
728 浏览

windows-phone-7 - MVVM 如何摆脱事件背后的代码

在查看了一些 MVVM 工具包(MVVM Light、SimpleMVVM)之后,共同主题似乎尝试使用尽可能多的可混合事件而不是使用代码隐藏。

我不确定如何进行所有活动。例如,在执行 windows phone 7 时会绑定 2 个事件。

  1. OnNavigatedTo/From
  2. 负载

有没有人有关于如何在 MVVM 中执行此操作的示例?我正在使用 SimpleMVVM,但我希望这些示例可能是相似的,也许 MVVM 轻量级工具包,甚至只是展示这点的一般 MVVM 教程可能会有所帮助。

我只找到了显示如何像按钮单击一样的操作。

编辑

我对何时使用事件背后的代码或使用混合事件来命令感到困惑。

例如,在 MVVM Light 教程中,他们使用 MVVM 进行导航,但为什么这比使用代码隐藏事件更好?

当人们说我现在也有点困惑

Codebehind 并不邪恶。它的业务逻辑和代码隐藏的混合是有问题的。让您的 UI 在代码隐藏中处理 UI 任务。

好吧,在 MVVM 轻量级示例中,当列表或其他任何内容(忘记)正在加载“加载标志出现”时,他们在其中一个示例中有“忙”。这一切都是在 ViewModel 中完成的,而不是代码隐藏事件。

所以这对我来说似乎有点矛盾(也许我错过了一些东西)。让我感到困惑的是,如果 ViewModel 对加载一无所知,你怎么知道加载何时开始或完成?

0 投票
1 回答
133 浏览

wpf - DevExpress 和 SimpleMvvmToolkit - 序列化错误

我有一个 DevExpress DxGrid 绑定到视图模型的 ObservableCollection(基于 SimpleMvvmToolkit)。视图模型有 2 个自身公开的属性(字符串和布尔值),其他一些属性由其基类 (ViewModelDetailBase) 公开,其中之一是视图模型背后的模型。

每次我使用网格修改属性之一的内容(例如布尔值)时,我都会收到一条错误消息“无法序列化类型 xxx..”(xxx 是模型的类型),然后是建议使用 DataContractAttribute 来规避问题。我不确定如何以及在哪里寻找解决方案。也许我应该阅读它,但为什么这里需要序列化?

无论如何,我希望你能对此有所了解。我很感激一些指示,让我朝着正确的方向前进。

编辑:由于情况太复杂,无法在此处发布相关代码,因此我制作了一个重现错误的沙箱项目。您可以通过这个 WeTransfer 链接找到它。

最好的问候,~Rob

0 投票
1 回答
291 浏览

.net - WPF 运行时在引发 INotifyPropertyChanged 接口的 PropertyChanged 事件后究竟做了什么

我在一次采访中被问到这个问题

“当我们想要在 ViewModel 的后端中更新绑定的属性时,在视图上反映属性的更改值时,我们通常会引发通过实现 INofityPropertyChanged 接口给出的事件。”

“所以,问题是我们没有将任何事件处理程序绑定到 propertychanged 事件,它是 wpf 运行时执行的。所以,在从 ViewModel 引发 propertychanged 事件之后究竟会发生什么。

0 投票
0 回答
229 浏览

c# - 有没有办法通过 viewmodel 在模型中传播输入验证

我有一个具有一些属性的模型,在该模型中我进行了一些验证检查(检查值是否不超过范围、是否为数字、是否为有效的邮政编码等)。我认为这些检查应该由模型完成。

我可以选择使用以下验证接口之一:INotifyDataErrorInfoIDataErrorInfo. 我没有偏好。

我有一个视图模型,它公开了模型的许多属性以及一些额外的、特定于视图的和管理属性,例如 IsSelected、IsInScope、IsSaved 等。

视图(在本例中是 DevExpress 的 DxGrid)绑定到视图模型的集合,因此它隐藏了模型的验证检查(它绑定到视图模型的接口)。有没有一种简单的方法可以将模型的验证检查传播到视图,并通过视图模型?

编辑:仅供参考,我正在使用 Simple MVVM Toolkit,它已将 INotifyDataErrorInfo 合并到其 Model 基类中,但未合并到其 Viewmodel 基类中。