不要WPF路由命令解决问题或使情况变得更糟?
-
19-08-2019 - |
题
据我所知,Command模式的目标是帮助从应用程序逻辑分离的用户界面交互。有了正确执行命令,在“打印”菜单项,点击可能会导致这样的互动链条:
(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)
这鼓励你到UI从应用逻辑分离。
我一直期待在WPF命令,并在大多数情况下我看到他们是如何实现这种模式。不过,我觉得在一定程度上,他们已经的复杂的命令模式,并成功地实现它在你正从应用程序逻辑分离UI鼓励这样的方式。
例如,考虑一个有一个按钮,以文本粘贴到文本框中这个简单的WPF窗口:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Paste"
Executed="CommandBinding_Executed"/>
</Window.CommandBindings>
<StackPanel>
<TextBox x:Name="txtData" />
<Button Command="Paste" Content="Paste" />
</StackPanel>
</Window>
下面的代码隐藏:
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
ApplicationCommands.Paste.Execute(null, txtData);
}
}
}
我是怎么从命令得到什么?在我看来,我可能有很容易地把代码从命令事件处理程序绑定到按钮的Click
事件。当然,现在我可以将多个UI元素与粘贴命令关联,我只需要使用一个事件处理程序,但如果我要贴到几个不同的文本框?我不得不使事件处理逻辑比较复杂或写更多的事件处理程序。所以现在,我觉得我有这样的:
(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|
我缺少的是在这里吗?它看起来像间接给我一个额外的层。
解决方案
在除了已经提到的事情,你已经忘记了你的具体粘贴例子是CommandTarget和CommandParameter性能。对于粘贴,可以通过设置作为CommandTarget指定文本框。
要使用的相同的RoutedCommand从不同的控制时,这些特性是绝对必要的。它们允许你给执行的处理约在其上调用命令的上下文的一些信息。
其他提示
您可能是令人困惑的概念。
在ICommand
接口支持命令模式。它允许你抽象用户动作到可重复使用的类。
选路命令是一个特定的实施ICommand
的,通过对处理程序的可视化树搜索。它们是可以通过许多不同的控制来执行命令特别有用的,你想要的电流控制来处理它。想复制/粘贴。可能有一大堆的可能处理它的控制,但通过使用路由命令,该命令路由系统会自动找到正确的控制来处理基于聚焦命令。
我将有利于建立控制时,使用RoutedCommands和RoutedUICommands。例如文本框实现UndoCommand你和输入guseture已经绑定到控制 + ž。 在构建视图模型,但是,我的偏好是与执行和CanExecute的内部实现自定义的ICommand。该DelegateCommand在棱镜提供了这一点。这使得视图/ XAML设计只担心命令,而不是正确的执行/ CanExecute处理程序使用。这将允许更表达视图模型
PS。代表命令不工作还没有(优雅)与化InputBindings。有人在微软可以解决这个问题,请!
它们可以是矫枉过正一些事情,但你得到像CanExecute一些不错的收益,可以自动地启用/禁用按钮/时的菜单项命令不可用(如选择任何文本等)。你也可以做的东西命令在Blend中,不使用任何代码,这是伟大的设计师。