问题标签 [relaycommand]

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 回答
52791 浏览

mvvm - MVVM 路由和中继命令

RoutedCommandRelayCommand 有什么区别?在 MVVM 模式中何时使用 RoutedCommand 以及何时使用 RelayCommand?

0 投票
2 回答
63899 浏览

c# - 如何在 wpf 中使用 RelayCommand?

如何 RelayCommand在 wpf 中使用?

0 投票
2 回答
6936 浏览

mvvm - RelayCommand lambda 语法问题

我正在应用 Josh Smith 的 MVVM 模式并且遇到了困难。我一直在这里研究这个问题,但似乎无法完全正确地使用语法。

在我看来,下面的代码遵循了所需的语法,但 Visual Studio 在指示的行上报告错误“Delegate 'System.Action' does not take '2' arguments”

有人可以看到我在哪里犯了错误吗?谢谢!
+汤姆

0 投票
1 回答
1168 浏览

wpf - MVVM 中将 RelayCommand 的处理定向到视图模型父级的正确方法

在某种程度上,我对 MVVM 甚至 WPF 都很陌生,所以请耐心等待...

我有一个 MVVM 应用程序,它有一个主窗口,根据应用程序状态包含不同类型的视图模型实例。其中一个视图模型是一个选项屏幕,其中包含一个用于重新启动应用程序并以不同用户身份登录数据库的按钮。 使用 RelayCommand,如何让父级(主窗口)处理此命令并发出 Window.Close() 方法调用?

0 投票
2 回答
2241 浏览

wpf - .NET 委托平等?

无论如何,我认为这是个问题。我正在使用一个 RelayCommand,它用两个代表装饰一个 ICommand。一个是 _canExecute 的 Predicate,另一个是 _execute 方法的 Action。

---背景动机--

动机与对WPF演示文稿的 ViewModel 进行单元测试有关。一种常见的模式是,我有一个 ViewModel 具有 ObservableCollection,并且我想要一个单元测试来证明该集合中的数据是我所期望的给定一些源数据(也需要转换为 ViewModel 的集合)。尽管两个集合中的数据在调试器中看起来相同,但看起来测试失败是由于 ViewModel 的 RelayCommand 上的相等性失败。这是失败的单元测试的示例:

--- 回到委托平等 ----

这是 RelayCommand 的代码 - 它基本上是对 Josh Smith 的想法的直接抄袭,我添加了一个相等的实现以试图解决这个问题:

在单元测试中,我有效地将 _execute 委托设置为相同的方法(_canExecute 在两种情况下都为空),单元测试在此行失败:

调试器输出:

谁能解释我缺少什么以及解决方法是什么?

---- 编辑评论 ----

正如 Mehrdad 指出的,调试会话中的 get_CloseCommand 起初看起来有点奇怪。它实际上只是一个属性获取,但它确实提出了一个问题,即如果我需要做一些技巧来使其工作,为什么代表的平等是有问题的。

MVVM 的一些要点是将演示文稿中可能有用的任何内容公开为属性,因此您可以使用 WPF 绑定。我正在测试的特定类在其层次结构中有一个 WorkspaceViewModel,它只是一个已经具有关闭命令属性的 ViewModel。这是代码:

公共抽象类 WorkspaceViewModel : ViewModelBase {

您可以看到 close 命令是一个 RelayCommand,并且我使用 equals 进行了修改以使单元测试工作。

@Merhdad 这是仅当我在相等比较中使用 Trickster 的 delegate.Method 时才有效的单元测试。

[TestFixture] 公共类 WorkspaceViewModelTests { private WorkspaceViewModel vm1; 私有 WorkspaceViewModel vm2;

----- 使用 MERHDAD 想法的最新编辑

调试器输出 ?valueOfThisObject {Smack.Wpf.ViewModel.RelayCommand} 基础 {SharpArch.Core.DomainModel.ValueObject}: {Smack.Wpf.ViewModel.RelayCommand} _canExecute: null _execute: {Method = {Void _executeClose(System.Object) }}

这是将代码更改为后的结果:

0 投票
1 回答
145 浏览

wpf - wpf mvvm equality

I would like to use an MVVM in a WPF project I'm working on, including the use of RelayCommands (aka DelegateCommands). I'm running into an interesting but frustration problem in implementing equality for my ViewModels, outlined here. I have a base class in my ViewModel hierarchy which examines all properties reflectively as part of its equality comparison, and the Command consistently fails even when it looks like it shouldn't.

How are others of you using this design approach dealing with equality?

Cheers,
Berryl

0 投票
5 回答
13142 浏览

wpf - Josh Smith 的 RelayCommand 实施是否存在缺陷?

考虑参考Josh Smith 的文章 WPF Apps With The Model-View-ViewModel Design Pattern,特别是 a 的示例实现RelayCommand(在图 3 中)。(这个问题不需要通读整篇文章。)

总的来说,我认为实现非常好,但我对'事件的CanExecuteChanged订阅委托有疑问。状态的文档CommandManagerRequerySuggestedRequerySuggested

由于此事件是静态的,它只会将处理程序作为弱引用。侦听此事件的对象应保持对其事件处理程序的强引用,以避免它被垃圾收集。这可以通过拥有一个私有字段并将处理程序分配为附加到此事件之前或之后的值来完成。

然而,示例实现RelayCommand并没有对订阅的处理程序进行任何维护:

  1. 这是否将弱引用泄漏给RelayCommand客户端,要求用户自己RelayCommand了解实现CanExecuteChanged并维护实时引用?
  2. 如果是这样,是否有意义,例如,将 的实现修改为RelayCommand如下所示,以减轻CanExecuteChanged订阅者潜在的过早 GC:

    /li>
0 投票
4 回答
11587 浏览

c# - 可以在 RelayCommand 上执行不工作

我正在使用 MVVM Light V3 alpha 3 编写一个 WPF 4 应用程序(带有 VS2010 RC),并且在这里遇到了一些奇怪的行为......

我有一个打开 的命令Window,并且该 Window 创建 ViewModel 等等 - 没有什么奇怪的。

在那Window我有一些RelayCommands,例如:

没有什么奇怪的了 - 它按我的预期工作。

问题是我不能拥有带有通用 RelayCommand 的 CanExecute 方法/lambda 表达式。

这有效:

但这不会:

窗口不显示。我的意思是,我单击打开窗口的按钮,应用程序被阻止,几秒钟后,窗口的InitializeComponent方法抛出一个NullReferenceException(对象引用未设置为对象的实例)

简而言之,如果我将CanExecuteMethod 放在 a 上RelayCommand<T>,则Window拥有ViewModel(带有RelayCommand<T>)的 the 将无法实例化。如果我删除CanExecuteWindow就会出现。

这里的问题在哪里?我很困惑。

谢谢你。

编辑:根据要求,这是堆栈跟踪:

0 投票
3 回答
871 浏览

wpf - 如何在类似 WPF MVVM 资源管理器的应用程序中实现依赖于当前选择的菜单项

我是 WPF 和 MVVM 的新手,我正在开发一个使用这两者的应用程序。该应用程序类似于 Windows 资源管理器,因此请考虑具有带菜单 (ShellViewModel)、树控件 (TreeViewModel) 和列表控件 (ListViewModel) 的主窗口的应用程序。我想实现Edit -> Delete之类的菜单项,它会删除当前选中的项(可能在树中或列表中)。

我正在使用 Josh Smith 的 RelayCommand,将 menuitem 绑定到 ShellViewModel 中的 DeleteItemCommand 很容易。然而,似乎实现 DeleteItemCommand 需要在 ShellViewModel 和两个子视图模型(TreeViewModel 和 ListViewModel)之间进行一些相当紧密的耦合,以跟踪焦点/选择并将操作定向到正确的子视图以进行实现。这对我来说似乎是错误的,让我觉得我错过了一些东西。

编写一个焦点管理器和/或选择管理器来记账似乎并不难,并且可以在不将类耦合在一起的情况下完成。窗口系统已经在跟踪哪个视图具有焦点,看起来我会复制代码。

我不确定如何将命令从 ShellViewModel 路由到 ListViewModel 或 TreeViewModel 以完成实际工作而不会弄乱代码。有一天,应用程序将扩展为包含两个以上的孩子,我希望 shell 尽可能不了解孩子,以使扩展尽可能轻松。

查看一些示例 WPF/MVVM 应用程序(Karl Shifflett 的 CipherText、Josh Smith 的 MVVM Demo等),我没有看到任何执行此操作的代码(或者我不明白)。

无论您是否认为我的方法偏离了基础,或者我只是错过了一个细微的差别,请分享您的想法并帮助我重回正轨。谢谢!

0 投票
2 回答
2185 浏览

wpf - 来自用户控件的 WPF 中继命令

我是 WPF 的新手,本着尝试以正确方式做事的精神,我尝试在我的应用程序中实现 MVVM。我使用了 Josh Smith 经常提到的文章,除了让我意识到我知道的有多么少之外,它让我有点难过。

具体来说,我有一个使用 RelayCommand 对象直接在页面上处理按钮的页面,这很好。但是,按钮(保存)最终将位于还包含其他按钮的用户控件上,并且该控件将在多个页面上使用。

我的问题是这个;如何将命令从用户控件传递到包含它的页面(即视图模型)?如果我绑定到命令

在用户控件上,我需要在用户控件本身上使用 Save 方法,而实际上我应该在视图模型上处理它。

任何人都可以帮忙吗?