据我所知,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中,不使用任何代码,这是伟大的设计师。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top