私が理解していることから、コマンドパターンの目標は、UIの相互作用をアプリケーションロジックから分離するのを助けることです。適切に実装されたコマンドを使用して、[印刷]メニュー項目をクリックすると、次のような一連の対話が発生する可能性があります。
(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要素を[貼り付け]コマンドに関連付けることができ、1つのイベントハンドラーを使用するだけで済みますが、複数の異なるテキストボックスに貼り付けたい場合はどうすればよいですか?イベントハンドラロジックをより複雑にするか、より多くのイベントハンドラを作成する必要があります。だから今、私はこれを持っているように感じます:
(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|
ここで何が欠けていますか?それは私には間接的な余分な層のように見えます。