问题标签 [canexecute]

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

wpf - 如何对 CanExecuteChanged 和 RaisePropertyChanged 进行单元测试

我正在尝试练习严格的 TDD,并且遇到了与 DelegateCommands 相关的问题,并测试了 CanExecute 是否已被调用。

这是我的两个测试标题:“当我从列表中选择一个项目时,我应该能够添加子项目”“当没有从列表中选择项目时,我应该无法添加子项目”

现在第一个测试通过了,因为我的单元测试从未调用过 CanAddChildItems,所以我编写了第二个测试以确保调用 CanAddChildItems。即使我将 AddChildItems.RaiseCanExecuteChaned() 放入 SelectedListItem 的设置器中也不是。

显然,如果没有 AddChildItems.RaiseCanExecuteChaned(),应用程序不会按要求运行,但如果我没有真正测试它的测试,我就不能把它放进去!

那么有什么想法可以让我自信地测试这个场景吗?

0 投票
3 回答
1083 浏览

c# - 在后台线程上使用 OleDbDataAdapter 会导致我的 UI 无法正确更新?

我有一个应用程序,用户可以在其中选择一个 Excel 文件,该 Excel 文件是使用OleDbDataAdapter另一个线程上的一个读取的,一旦读取完成,它会将我的 ViewModel 中的命令的 CanExecute 属性更新为 true,因此启用了“保存”按钮。

我的问题是,即使命令的 PropertyChanged 事件被引发并且 CanExecute 被评估为 true,UI 上的按钮也永远不会启用,直到用户执行某些操作与应用程序交互(单击它,选择一个文本框等) )

这是一些显示问题的示例代码。只需将其连接到绑定到SaveCommand和的两个按钮SelectExcelFileCommand,然后创建一个带有调用列的 excel 文件IDSheet1测试它。

编辑

我尝试使用 Dispatcher 以更高的优先级发送 PropertyChanged 事件,并将 PropertyChanged 调用移到异步方法之外,但是这两种解决方案都无法正确更新 UI。

如果我删除线程,或者在调度程序线程上启动从 Excel 读取的进程,它确实有效,但是这两种解决方案都会导致应用程序在读取 excel 文件时冻结。在后台线程上阅读的重点是用户可以在文件加载时填写表单的其余部分。这个应用程序使用的最后一个文件有近 40,000 条记录,并且使应用程序冻结了一两分钟。

0 投票
2 回答
694 浏览

wpf - WPF CanExecute 和 ThreadPool

我的应用程序执行 web 服务调用,当它发生时,IsExecuting 状态设置为 true 并且执行按钮被禁用。因为在此期间应用程序没有响应,所以我更改了进程,因此执行发生在单独的线程中。但是我现在注意到的问题是,执行按钮仍然被禁用,只有当我点击界面时,按钮才会启用。我怎样才能解决这个问题?

编辑:在代码隐藏中:

0 投票
1 回答
174 浏览

wpf - 在 WPF 中缓存 CanExecute(或任何东西)?

System.Web 中的 Cache 对象非常好。

我处理我的 CommandBinding.CanExecute 有点像这样:

在我的场景中, NotInsignificantRoutine() 的返回值在 5 秒的窗口内不会改变。在 WPF 中缓存的最佳方法是什么?导入 System.Web?

0 投票
1 回答
688 浏览

c# - 为什么我的 ContextMenu 项绑定到 RelayCommand 总是被禁用?

我现在正在开发我的第一个大型 WPF MVVM 应用程序,它使用 MVVM Light Toolkit 和 Josh Smith 的 RelayCommand。我遇到的问题是我将此命令绑定到 ContextMenu 中的一个项目,该项目一直处于禁用状态。

这是 MenuItem 的代码片段:

现在我对命令绑定所做的如下:我使用了一个名为 CommandReference 的类,我在这里找到了它。

这是命令引用本身:

我这样做的原因是因为我注意到 ContextMenu 上的命令绑定问题(由于 ContextMenu 不是逻辑/可视树的一部分)。我在网上找到了几个关于这个主题的主题,其中一些我发现了 CommandReference 类,这似乎是我的问题的一个很好的解决方案。这些命令绑定问题确实消失了,但似乎无法识别我的命令的 CanExecute 或由于 MenuItem 保持禁用状态。

在 ViewModel(作为其 DataContext 绑定到视图)中,我有以下命令代码:

我在这里缺少什么来使我的代码正常工作?我认为这可能与我正在使用的 CommandReference 有关,但我不知道要查找什么。

真心希望大家帮忙!

0 投票
1 回答
414 浏览

wpf - WPF 用户控件和 ICommand

我创建了一个 UserControl,里面有一个按钮,还有一个按钮样式。该样式在鼠标悬停触发器时设置按钮背景。现在我添加了一个 ICommand 类型的依赖属性并将按钮命令设置为这个新属性。命令绑定可以正常工作,但是当禁用自定义控件(canexecute = false)时,鼠标悬停触发器仍会更改背景。

我试过像这样更改鼠标悬停触发器,但它不起作用:

任何人都可以帮忙吗?

0 投票
1 回答
983 浏览

wpf - 并非在所有情况下都调用命令的 CanExecute 部分。是什么决定了它?

在我使用 MVVM 的 WPF 应用程序中,我注意到在某些情况下不会调用命令的 CanExecute 部分,所以我想知道什么决定何时调用这种(某种)方法?

0 投票
1 回答
236 浏览

c# - CanExecute() 中的错误 - 如何摆脱对话框?

我正在尝试处理对话框中的异常,以便如果发生任何异常,对话框将关闭并且应用程序不会崩溃。如您所见,我使用了一个简单的 try-catch 块:

CanExecute()当按钮的事件处理程序中发生错误时,就会出现问题。错误被成功捕获,但是当我向MessageBox用户显示时,CanExecute()再次执行,因此错误再次发生。最后导致应用程序崩溃。

我搜索了一些信息,据说是为了确保CanExecute()事件处理程序中没有异常。但是这样的事情可能发生在其他地方,这就是为什么我想简单地捕获对​​话框入口点中的所有异常而不使用每个方法。

所以,我的问题是:如何销毁对话框,以便在异常捕获后不再显示?Close()没有用,因为在关闭之前它仍然调用CanExecute().

0 投票
1 回答
603 浏览

wpf - 我知道我在 RaiseCanExecuteChanged 和 CanExecute 上做错了

好吧,在摆弄了 MVVM 灯以让我的按钮在我想要的时候启用和禁用......我把东西混在一起直到它起作用。

但是,我只知道我在这里做错了什么。我在被调用的同一区域中有 RaiseCanExecuteChanged 和 CanExecute。当然这不是它的做法吗?

这是我的xml

这是我的代码

看看这两个是怎么在一起的?这肯定是不对的。我的意思是……它对我有用……但它似乎有些不对劲。RaiseCanExecuteChanged 不应该调用 CanExecute 吗?它没有......所以如果我没有那个 CanExecute ,我的控件永远不会像我需要的那样切换它的 IsEnabled 。

编辑:

如果我最终使用按钮的 Command 属性将我的命令绑定到...一切正常。我可以删除 CanExecute 并留下 RaiseCanExecuteChanged ,一切正常。

像这样......这工作得很好。

0 投票
1 回答
424 浏览

wpf - 除非打开 RibbonGroup 下拉菜单,否则 WPF Command CanExecute 事件不会触发

我在 RibbonTab 中有大约 5 个 RibbonGroups,每个功能区组包含大约 3-5 个命令。为了适应屏幕上的所有内容,WPF Ribbon 控件会自动将几个 RibbonGroups 折叠到下拉菜单中。到这里为止没有什么特别的。

现在我看到折叠的 RibbonGroups 中的命令的 CanExecute 事件在第一次打开下拉菜单之前不会触发。(这可能是为了提高性能 - 即除非任何命令可见,否则需要触发 CanExecute!?)

在我的应用程序中,逻辑是,如果在 RibbonGroup 中没有启用任何命令(即 CanExecute 为 false),则我们隐藏该 RibbonGroup。但除非所有 CanExecute 都被触发,否则我不知道启用了多少(或所有)命令。

这是 RibbonGroup 的限制还是设计使然?是否有任何解决方法可以手动执行所有 CanExecutes,至少一次,无论命令是否在折叠的 RibbonGroup 中。

顺便说一句,CommandManager.InvalidateRequerySuggested()这里也无济于事。