问题标签 [routed-commands]

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

wpf - WPF 跨元素树分支路由事件

我想知道在 WPF 中启用控件之间通信的正确机制是什么。我的目标是不使用常规事件,而必须手动连接它们。路由命令(隧道、冒泡)的默认行为似乎是正确的,但我想我错过了一些东西。

路由事件是 WPF 提供的一种新的基础结构,它允许事件沿着可视化树向下传送到目标元素,或者冒泡到根元素。当一个事件被引发时,它会向上或向下“移动”可视化树,在它在途中遇到的订阅该事件的任何元素上调用该事件的处理程序。 注意这个树遍历并没有覆盖整个视觉树,只覆盖了祖先元素

那是来自这篇WPF 文章

使用文章中的图像,我希望“立即元素 #1”启动(引发)一个事件,然后让“立即元素 #2”处理该事件。我想实现这一点,而不必在“根元素”中放置任何代码。

基本上从我的应用程序中的任何地方触发一个事件(保存、更新状态、更改选择等),然后让它在其他地方处理,而两方不知道彼此的任何信息。这可能吗?

我不相信数据绑定是答案。我想使用路由事件/命令,因为它们是在整个树中设计的,而不仅仅是在源代码管理的分支中。也许使用路由事件/命令无法完成,数据绑定就是答案。我只是不知道...

有任何想法吗?

0 投票
1 回答
683 浏览

wpf - 将 ViewModel 中的命令绑定到 View 中的元素的最佳方法是什么?

任何尝试使用 MV-VM 在 WPF 中实现 RoutedCommands 的人无疑都会遇到问题。命令(即非 UI 命令)应在 ViewModel 中实现。例如,如果我需要保存 CustomerViewModel,那么我会直接在我的 CustomerViewModel 上将其实现为命令。但是,如果我想弹出一个窗口来显示用户地址,我会直接在视图中实现 ShowCustomerAddress 命令,因为这是一个特定于 UI 的功能。

如何在视图模型中定义命令绑定,并在视图中使用它们?

0 投票
4 回答
2875 浏览

.net - WPF 路由命令是解决问题还是使问题变得更糟?

据我了解,命令模式的目标是帮助将 UI 交互与应用程序逻辑分开。使用正确实现的命令,单击“打印”菜单项可能会导致如下交互链:

这鼓励您将 UI 与应用程序逻辑分开。

我一直在研究 WPF 命令,并且在大多数情况下,我看到了它们是如何实现这种模式的。然而,我觉得在某种程度上他们已经复杂化了命令模式并设法以这样一种方式实现它,以至于你不鼓励将 UI 与应用程序逻辑分离。

例如,考虑这个简单的 WPF 窗口,它有一个用于将文本粘贴到文本框中的按钮:

这是代码隐藏:

我从命令中得到了什么?在我看来,我可以很容易地将命令绑定事件处理程序中的代码放入按钮的Click事件中。当然,现在我可以将多个 UI 元素与粘贴命令相关联,并且只需要使用一个事件处理程序,但是如果我想粘贴到多个不同的文本框怎么办?我必须使事件处理程序逻辑更复杂或编写更多事件处理程序。所以现在,我觉得我有这个:

我在这里想念什么?对我来说,它看起来像是额外的间接层。

0 投票
2 回答
804 浏览

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

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

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

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

麦克风

0 投票
2 回答
795 浏览

wpf - 上下文相关的 RoutedUICommand.CanExecute,执行

我有一个 RoutedUICommand,可以通过 UI 中的各个位置进行访问。如全局Keyboardshortcut、Menu、ContextMenu或Button。要在 RoutedUICommand.CanExecute 和 RoutedUICommand.Execute 方法中执行的代码取决于所使用的 UI 元素。我怎样才能实现这种差异化。我在想我可以使用 (Can)ExecutedRoutedEventArgs.Source 或 OrigianlSource 但源始终相同。它是主根窗口。这通常是如何实现的?我可能做错了什么?

0 投票
4 回答
8815 浏览

wpf - WPF 使用自定义 RoutedUICommands 还是简单的事件处理程序?

今天我正在和某人谈论如何选择一种设计模式来处理他们的 WPF 程序中的逻辑,并希望 SO 社区可以提供进一步的建议以使决策更容易。哪些因素有利于命令胜过不便?

我准备了一个完整的示例以及三种方法中前两种的一些UML 图:

  1. 在按钮和菜单上使用 Click 事件处理程序。
  2. 使用 XAML 中绑定的命令。
  3. 使用代码中绑定的命令,并为纯 GUI 布局和样式保留 XAML。

他参加的入门课程和许多书籍都将简单的 Click 事件处理程序作为将逻辑连接到 UI 对象的自然方式。

他对使用命令所需的开销量感到有些震惊,而命令是在代码隐藏文件中创建的:

然后是 XAML 中的更多代码,必须以冗长的方式识别和绑定命令:

我(还)不能声称自己是 WPF 专家,所以我可能把事情画得比实际更复杂,但我怀疑你不能比上面更简单地简化事情。

编辑:

我在 DelegateCommand、RoutedCommand 和 Event 之间发现了一个有趣的3 路比较。

0 投票
1 回答
2695 浏览

c# - 在 WPF 用户控件中公开多个命令

一个更好的解释,我希望:

  • 我有一个带有 3 个按钮的工具栏,所有三个按钮都绑定到一个命令(包括一个命令参数)
  • 此工具栏用于多个屏幕
  • 工具栏的 xaml 在所有这些屏幕上都完全相同

我想删除工具栏实例并将其替换为提供 3 个命令的用户控件,这样我就可以在每个屏幕中保留绑定。计划稍后更改工具栏功能,但外部编程接口(即 3 个命令)是相同的。

所以:

  • 我创建了一个用户控件,并为每个命令(OneCommand、OneCommandParameter、OneCommandTarget)创建了 3 组依赖属性,因此我可以将它们用于绑定。
  • 我在用户控件 xaml 中移动了工具栏 xaml。
  • 我修改了工具栏按钮上的绑定以绑定到内部用户控件属性
  • 在每个屏幕上(或者实际上,现在只有第一个屏幕)我用用户控件替换了原始工具栏,将新属性绑定到正确的命令。

控件显示,但按钮不起作用。就是这样。

--

原始解释 - 不太清楚:

我有一个封装了许多按钮的 WPF 用户控件。以前,该控件是一个带有许多按钮的工具栏,但由于我需要在多个屏幕上具有完全相同的功能,因此我将工具栏重构为自定义控件。

但是,我想保留原始按钮的命令绑定。

  • 我在用户控件上创建了 3 组依赖属性(XCommand、XCommandParameter 和 XCommandTarget)。
  • 在用户控件 xaml 中,我将“真实”按钮绑定到这些属性(每个按钮到每组属性)。
  • 在我使用用户控件的地方,我将新属性绑定到真正的命令绑定。

本质上,我想为用户控件公开的每个“命令”保留 ICommandSource 功能。但是,这种双重数据绑定方案似乎不起作用,或者我做错了什么。:)

有一个更好的方法吗?我所需要的只是将控件外部的命令“桥接”到内部按钮,以便保留 Execute 和 CanExecute 功能。

0 投票
1 回答
3729 浏览

wpf - 如何将我的 RoutedCommand 处理程序从 View-codebehind 移动到 ViewModel?

以下 RoutedCommand 示例有效。

但是,执行命令的按钮的处理是在 view 的代码隐藏中。我理解 MVVM 的方式,它应该在 ViewModel 中

但是,当我将该方法移动到 ViewModel(并将其更改为 public)时,我收到错误“ ManagedCustomersView 不包含 OnSave 的定义”。即使我将 RoutedCommand 第二个参数更改为 typeof(ManageCustomersViewModel),我也会收到相同的错误。

如何将命令处理程序从 View-codebehind 移动到 ViewModel?

ManageCustomersView.xaml:

ManageCustomersView.xaml.cs:

命令.cs:

0 投票
2 回答
6011 浏览

.net - WPF - 为什么 ContextMenu 项目适用于 ListBox 而不是 ItemsControl?

列表中的项目具有上下文菜单。上下文菜单项绑定到路由命令。

如果列表控件是 a ,则上下文菜单项可以正常工作ListBox,但是一旦我将其降级为 aItemsControl它就不再工作了。具体来说,菜单项始终是灰色的。我的CanExecute回调CommandBinding也没有被调用。

是什么ListBox让带有命令的上下文菜单项正确绑定?

以下是我为突出问题而整理的示例应用程序的一些摘录:

这是视图模型和数据项的 C# 代码:

这是控件的 C# 代码隐藏:

只是为了重申这个问题 - 是什么ListBox提供了允许它的上下文菜单项命令正确绑定的东西,有什么方法可以让它工作ItemsControl吗?

0 投票
2 回答
1677 浏览

wpf - RoutedCommand 的类构造函数 ownertype 参数有什么用?

RoutedCommand 的构造函数将“所有者类型”作为最后一个参数。它的意义是什么?什么时候使用?

MSDN 文档完全不知道为什么需要它以及我是否可以对所有命令使用一种类型

引用自 MSDN

还有一件事。从名称数组动态创建新的路由命令时应该使用什么类型。看起来任何类型都有效,所以我使用的是 UIElement,但如果有更适合的类型,我想知道。