我有这个代码(工作正常):
<KeyBinding Key="Enter" Command="{Binding ReturnResultCommand}">
<KeyBinding.CommandParameter>
<s:Boolean>
True
</s:Boolean>
</KeyBinding.CommandParameter>
</KeyBinding>
Run Code Online (Sandbox Code Playgroud)
其中"s"当然是System命名空间.
但是这个命令被调用了很多次,它实际上膨胀了相当简单的XAML代码.这是否是XAML中布尔命令参数的最短符号(除了将命令分成几个命令)?
您好我最近调查了WPF并开始学习事件和命令.我通常使用按钮点击命令,这导致方法在我的"视图模型"中运行.
是否可以通过使用提交使Button对任何其他事件(如MouseOver事件)做出反应?或者在这种情况下会使用WPF事件?
如果要使用WPF事件,那么事件处理程序实现是否应该在视图模型中调用方法以保持关注点?
我有兴趣创建可在我的WPF应用程序中的任何位置使用的命令.
我希望他们能够在相同的方式工作Cut,Copy,Paste和其他应用程序级别的命令,即:
<Button Command="Paste" />
Run Code Online (Sandbox Code Playgroud)
我假设我可以为Application实例设置CommandBindings,但该属性不可用.
这是怎么做到的?
到目前为止我所管理的最好的是在顶级窗口上创建一套命令,然后像这样访问它们......:
<Button Command="{x:Static namespace::MainWindow.CommandName}" />
Run Code Online (Sandbox Code Playgroud)
哪个有效,但当然紧密耦合,非常脆弱.
我试图对它进行一些阅读,但我没有找到能够令人满意地解释RoutedCommand和RoutedUICommand之间差异的文档.
我已经使用MVVM-Light成功使用了一些自定义命令,但我希望我的应用程序能够响应标准的ApplicationCommands,而不仅仅是在Window级别,而是在详细的项目级别.
我有一个TreeView我希望能够复制和粘贴节点.每个TreeViewItem都有自己的ViewModel,它们通过HierarchicalDataTemplatesXAML 显示,因为有几种不同的类型.我已经在我的ViewModel类上实现了复制,粘贴以及CanCopy和CanPaste的方法.如果合适的话,我可以很容易地实现指向这些的MVVM-Light RelayCommands,但这似乎不对.
我想使用菜单,Ctrl + C和Ctrl + V或最终的上下文菜单来访问命令.我也不想破坏我的UI中其他元素的复制/粘贴功能,例如TextBoxes.为此目的使用内置的ApplicationCommands似乎是合适的.但是,我只看到在UserControl代码隐藏中处理这些示例.我没有(或需要)UserControl,也不是真正关注MVVM.
有没有办法可以绑定ApplicationCommand.Copy和ApplicationCommand.Paste命令我的ViewModel,即在数据模板中?
我试图在我的WPF应用程序中使用Undo/Redo键盘快捷键(我使用命令模式实现了自己的自定义功能).但是,似乎TextBox控件正在拦截我的"撤消"RoutedUICommand.
什么是禁用此功能的最简单方法,以便我可以在UI树的根目录中捕获Ctrl + Z?TextBox如果可能的话,我想避免在我的应用程序中添加大量代码/ XAML .
以下简要说明问题:
<Window x:Class="InputBindingSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:InputBindingSample"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="loc:Window1.MyUndo" Executed="MyUndo_Executed" />
</Window.CommandBindings>
<DockPanel LastChildFill="True">
<StackPanel>
<Button Content="Ctrl+Z Works If Focus Is Here" />
<TextBox Text="Ctrl+Z Doesn't Work If Focus Is Here" />
</StackPanel>
</DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
using System.Windows;
using System.Windows.Input;
namespace InputBindingSample
{
public partial class Window1
{
public static readonly RoutedUICommand MyUndo = new RoutedUICommand("MyUndo", "MyUndo", typeof(Window1),
new InputGestureCollection(new[] { new KeyGesture(Key.Z, ModifierKeys.Control) }));
public …Run Code Online (Sandbox Code Playgroud) 您能否提供一个示例,了解如何实现ICommandSource界面.因为我希望我的UserControl,没有能力在xaml中指定命令,才能拥有此功能.并且能够在用户点击时处理该命令CustomControl.
根据我对MVVM的理解,直接在ViewModel中处理路由命令是一种很好的做法.
当路由命令在ViewModel中定义为RelayCommand(或DelegateCommand)时,很容易直接绑定到命令,如下所示:Command = {Binding MyViewModelDefinedCommand}.
实际上,对于在我的ViewModel之外定义的路由命令,我在View后面的代码中处理这些命令并将调用转发到ViewModel.但我发现我必须这样做很尴尬.它违背了推荐的MVVM良好做法.我认为应该有一种更优雅的方式来实现这项工作.
如何直接在ViewModel中处理"System.Windows.Input.ApplicationCommands"或在Viewmodel外部定义的任何路由命令.换句话说,对于在ViewModel之外定义的命令,我如何直接处理ViewBodel的CommandBinding回调"CommandExecute"和/或"CommandCanExecute"?这有可能吗?如果有,怎么样?如果不是,为什么?
RoutedCommand和RoutedUICommand有很多功能.有文本和键盘手势的烘焙支持.您可以将RoutedUICommands的集合绑定到Menu的ItemsSource,它将自动为您创建和绑定菜单项.开箱即用的控件自动支持某些命令(剪切,复制,粘贴).
但是,每当我使用MVVM时,我发现路由命令都不合适,因为我必须为每个命令编写重复的样板XAML和代码隐藏.当我在做MVVM时,我通常会使用RelayCommand而不是路由命令.这在某些时候是一个充分的解决方法,但它有缺点 - 例如,关键手势变得更加复杂.
但在看完Rob Eisenberg的"构建你自己的MVVM框架"会议之后,我不再满足于继电器命令及其缺点.路由命令的唯一问题是重复的样板代码,一旦将重复代码分解到框架中并应用约定,似乎没有任何理由不在MVVM中使用路由命令.
从技术上讲,看起来这并不难.框架应该只需要绑定到视图的CommandManager.CanExecute和Executed事件,并应用约定来查找ViewModel上的方法和属性 - 例如,执行Cut命令时,查找ExecuteCut方法(以及CanExecuteCut属性) )在ViewModel上.我可以构建自己的MVVM框架,使这很容易.
但我的问题是,是否已经有与RoutedCommand一起使用的MVVM框架?我唯一熟悉的唯一MVVM框架是Caliburn.Micro,它目前不支持这种方式的路由命令(这让我感到惊讶,因为它确实支持它自己的动作冒泡).