问题标签 [delegatecommand]

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 投票
1 回答
338 浏览

.net - 无法订阅 DelegateCommand.CanExecuteChanged

我有两个 ViewModel,一个包含另一个。内层有一个Microsoft.Practices.Prism.Commands.DelegateCommandPrintCommand。最好订阅CanExecuteChanged此命令的事件。这部分照常实现:

问题是这个订阅不起作用。反编译后CanExecuteChanged的样子:

当我调试时,订阅后的几个步骤后_canExecuteChangedHandlers似乎不包含任何活动处理程序,即使订阅者对象仍然存在。
我有点好奇,为什么会这样?

0 投票
1 回答
645 浏览

c# - 没有 PRISM 的绑定命令

自从我开始使用 MVVM 以来,我一直使用 PRISM 的 DelegateCommand 类将我的视图模型中的命令绑定到我的视图中的按钮命令。我相信 Telerik 也有一个等效的 DelegateCommand。

我的问题是,是否有使用 prism 和 telerik 等 3rd 方框架的内置替代方案。如果我将一个快速的一次性应用程序放在一起,我可能不想从 NuGet 安装包的麻烦。有没有办法使用 Func 或 Action 或委托来实现相同的目标?

0 投票
3 回答
1386 浏览

c# - MVVM ICommand.CanExecute 参数包含以前的值

如果使用嵌套属性而不是普通属性,我很难理解为什么 ICommand.CanExecutes 总是包含以前的值而不是新值。

问题在下面描述,除了使用某种形式的“外观”模式之外,我真的无法找到解决此问题的方法,我在视图模型中创建属性并将它们挂钩到模型中的相应属性。

或者使用该死的 CommandManager.RequerySuggested 事件。这不是最佳的原因是因为视图显示了 30 多个命令,仅计算菜单,如果每次更改时所有 CanExecute 都更新,则所有菜单项/按钮都需要几秒钟才能更新。即使使用下面的示例,仅使用一个命令和按钮以及命令管理器,按钮也需要大约 500 毫秒来启用/禁用自身。

我能想到的唯一原因是在 CanExecute 被触发之前 CommandParameter 绑定没有更新,然后我想你无能为力。

提前致谢 :!

例如

假设我们有这个基本的视图模型

和这个模型

现在在我看来,我有这个文本框和按钮。

它有效,每次我在文本框中键入内容时都会调用 CanExecute,但参数始终设置为先前的值。假设我在文本框中写了“H”,CanExecute 被触发,参数设置为 NULL。接下来我写“E”,现在文本框包含“HE”,CanExecute 再次触发。这次仅将参数设置为“H”。

出于某种奇怪的原因,该参数始终设置为以前的值,当我检查 Project.Text 时,它设置为“HE”,但参数仍设置为仅“H”。

如果我现在将命令参数更改为

和 Textbox.Text 到

一切正常。CanExecute 参数始终包含最新值而不是先前值。

0 投票
2 回答
1592 浏览

wpf - WPF:CanExecute 始终被禁用

我有一个文本框供用户输入字符串,还有一个“添加”按钮可以使用该值执行一些任务。我向 DelegateCommand 添加了一个 CanExecute 方法,以便该按钮仅在框中有文本时才起作用。

然而,它一直被禁用——即使条件为真。在框中键入不会启用按钮。

我以前发生过这种情况(并不总是使用相同类型的控件),通常我只会删除 CanExecute 并将其更改为操作方法中的“if”检查。不过,这一次,我实际上必须让它工作并以“正确”的方式将按钮变灰。

任何见解将不胜感激。提前致谢。

更新:

我已将 RaiseCanExecuteChanged 添加到 BuildEntryText 属性的设置部分。现在按钮开始禁用并在第一次输入文本时启用。但是,即使在删除文本或通过添加功能清除框后,它仍保持启用状态。

0 投票
2 回答
967 浏览

c# - RaiseCanExecuteChanged 在编译的 exe 中不起作用,但在调试时起作用

我完全知道是什么原因造成的。

背景:使用 Prism 框架

  1. 我有一个按钮绑定到DelegateCommand
  2. 我打电话RaiseCanExecuteChanged

当我在 Visual Studio 中以调试模式启动应用程序时,一切正常。该应用程序运行完美。

然后当我通过 .exe 打开应用程序时,RaiseCanExecuteChanged没有调用该方法。我不知道为什么会这样。还有其他人遇到类似的问题吗?


编辑:当我第一次通过 .exe 打开应用程序时,RaiseCanExecuteChanged会调用它(因为我在 my 的构造函数中设置了它ViewModel)。但是,它再也不会被调用。


需要时的代码:

我什至绝望了,并试图IsEnabled在我的 Button 中放置一个属性,但我必须CanExecuteButton……但无济于事。

0 投票
2 回答
938 浏览

c# - CompositeCommand 等待所有子命令完成

在我的对话框中,我有一个TabControl使用 ChildViews 的Prism. 对于保存命令,我使用的是CompositeCommand. 一切都按预期工作。唯一的问题是:我想等待每个 ChildViewModel 完成异步保存过程,然后在一切完成后关闭对话框。

不幸的是 CompositeCommands 不支持该功能。那么如何才能等到每个 ViewModel 都完成工作后再关闭对话框呢?

在此处输入图像描述

0 投票
2 回答
2716 浏览

wpf - 如何使用 Prism 6 正确制作 CanExecute 触发器

我有一个模型

然后我的 ViewModel 有两个版本

这是我的观点

Version1 工作正常,当绑定到 Name (TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}") 的 TextBox 为空或为空时,保存按钮将禁用。

但在版本 2 中,保存按钮不会禁用。它只在初始化时调用 CanExecute 方法,删除 TextBox 中的文本不会禁用 Button。我做错了什么?

0 投票
1 回答
1008 浏览

c# - 为什么 Prism DelegateCommands 有时会导致线程异常?

下面的示例使用 Prism 6.1 中的 DelegateCommand,但我在 5.0 中产生了相同的问题。

使用以下视图模型(视图省略,仅包含 2 个按钮):

如果先调用 ActiveCommand,则会发生此异常:

WindowsBase.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:调用线程无法访问此对象,因为不同的线程拥有它。

据我所知,这是标准的“如果您不在 UI 线程上,则不允许您与 Wpf 控件交谈”例外。这似乎与方法摘要不一致:

在 UI 线程上引发 Prism.Commands.DelegateCommandBase.CanExecuteChanged,以便每个命令调用者都可以重新查询以检查命令是否可以执行。

此外,我过去从非 UI 线程调用此方法也没有问题。

更奇怪的是,如果首先引发 TestCommand,那么 ActionCommand 开始正常工作。我已经检查过了,Task.Run 块中的代码在所有情况下都在非 UI 线程上运行。

不幸的是,我不能在我的真实代码中使用它作为解决方法——我尝试在工作线程执行之前让 UI 线程调用 RaiseCanExecuteChanged,但它没有帮助。

RaiseCanExecuteChanged 有什么理由这样做吗?任何修复或解决方法?

0 投票
1 回答
5403 浏览

wpf - WPF PRISM 6 DelegateComand ObservesCanExecute

提前致谢!

我应该如何在 PRISM 6 的 DelegateCommand 中使用 ObservesCanExecute?

不幸的是,我不熟悉 c# 中的表达式。另外,我认为这对其他人会有所帮助。

0 投票
1 回答
294 浏览

mvvm - 属性更改时未执行委托命令

我目前正在尝试使 ViewA 中的滑块更改 viewA 和 viewB 中文本的字体大小。我已经正确绑定了所有内容,但是当字体大小属性更改时,委托命令没有调用执行方法。如果我手动调用这个函数,一切都会按预期工作,所以很可能是一行代码出现了问题。ViewAViewModel 如下: