Por lo que entiendo, el objetivo del patrón de comando es ayudar a separar la interacción de la interfaz de usuario de la lógica de la aplicación. Con comandos implementados adecuadamente, un clic en un elemento de menú "Imprimir" podría dar lugar a una cadena de interacción de esta manera:¿Los comandos enrutados de WPF resuelven un problema o lo empeoran?
(button) ---click executes command----> (command) ---calls Print() in app logic ---> (logic)
Esto le anima a separar la interfaz de usuario de la lógica de la aplicación.
He estado viendo los comandos de WPF, y en su mayor parte veo cómo han implementado este patrón. Sin embargo, creo que hasta cierto punto tienen el complicado patrón de comando y se las han arreglado para implementarlo de tal manera que no se recomienda separar la interfaz de usuario de la lógica de la aplicación.
Por ejemplo, considere esto simple ventana de WPF que tiene un botón para pegar texto en el cuadro de texto:
<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>
Aquí está el código subyacente:
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
ApplicationCommands.Paste.Execute(null, txtData);
}
}
}
¿Qué gano con el ¿mando? Me parece que podría haber puesto fácilmente el código del controlador de eventos de enlace de comandos en el evento Click
del botón. Claro, ahora puedo asociar varios elementos de la interfaz de usuario con el comando Pegar y solo tengo que usar el controlador de eventos, pero ¿qué sucede si quiero pegar en varios cuadros de texto diferentes? Tendría que complicar la lógica del controlador de eventos o escribir más manejadores de eventos. Así que ahora, siento que tengo esto:
(button) ---executes Routed Command---> (Window) ---executes command binding----(command binding)
(logic) <---calls application logic--- (event handler) <-----raises event --------------|
¿Qué me falta aquí? Parece una capa extra de indirección para mí.
Leí un capítulo de un libro sobre comandos anoche y encontré esta información, luego me sentí como una droga. – OwenP