Windows Presentation Foundation provee unos tipos de eventos abstractos y
desacoplados que han sido llamados Comandos. Realmente la gran diferencia
existente con respecto a eventos clásicos como el que se lanza cuando un
usuario selecciona un elemento en una lista desplegable, es que los comandos
no están ligados al interfaz de usuario que los exponen, es decir, solo
representan acciones independientemente del interfaz.
Realmente los comandos no son una invención de Windows Presentation
Foundation, esta tecnologia ya estaba presente en Microsoft Foundation
Classes (MFC) con un mecanismo similar.
En este tipo de eventos para describir el modelo existen cuatro piezas clave.
Commands
Representa una tarea de un aplicativo la cual mantiene en todo momento si
puede o no ser ejecutada.Command Sources
Son los que lanza un comando, es decir, un botón podría ser un Command
Source ya que puede lanzar un comando.Command Bindings
Usando un mismo comando con diferentes bindings podemos lanzar dicho
comando en diferentes sitios teniendo un significado diferente en cada lugar,
es decir, cada command binding enganchará un comando con la lógica
necesaria.Command Targets
Para ver este último elemento recurramos al tipico ejemplo del comando
Pegar, donde el Command Target será el elemento donde el comando actuará.
Es decir, en el caso del comando Pegar, el command target será el TextBox
donde se pegará el texto que hubiera en el portapapeles.
ICommand
Todo comando implementa el interfaz ICommand que esta disponible en
System.Windows.Input. Este interfaz incluye tres miembros: dos métodos y un
evento.
Execute
Contendrá la lógica ha implementar por el comando en la aplicación.
CanExecute
Sirve para devolver el estado del comando pudiendo comunicar si este esta
habilitado o no.
CanExecuteChanged
Siempre que el valor de CanExecute cambie se lanzará un evento informando
de ello.
public class MyCommand: ICommand { public bool CanExecute(object parameter) { throw new NotImplementedException(); } public event EventHandler CanExecuteChanged; public void Execute(object parameter) { throw new NotImplementedException(); } }
Comandos por defecto
Por suerte, no hay que implementar comandos comunes como Cortar, Pegar,
Copiar, etc ya que WPF provee una serie de comandos preestablecidos y
expuesto como propiedades estáticas en cinco clases diferentes
ApplicationCommands
Close, Copy, Cut, Delete, Find, Help, New, Open, Paste, Print, PrintPreview,
Properties, Redo, Replace, Save, SaveAs, SelectAll, Stop, Undo, etc.ComponentCommands
MoveDown, MoveLeft, MoveRight, MoveUp, ScrollByLine, ScrollPageDown,
ScrollPageLeft, ScrollPageRight, ScrollPageUp, SelectToEnd, SelectToHome,SelectToPageDown, SelectToPageUp, etc.
MediaCommands
ChannelDown, ChannelUp, DecreaseVolume, FastForward, IncreaseVolume,
MuteVolume, NextTrack, Pause, Play, PreviousTrack, Record, Rewind, Select,Stop, etc.
NavigationCommands
BrowseBack, BrowseForward, BrowseHome, BrowseStop, Favorites, FirstPage,
GoToPage, LastPage, NextPage, PreviousPage, Refresh, Search, Zoom, etc.EditingCommands
AlignCenter, AlignJustify, AlignLeft, AlignRight, CorrectSpellingError,
DecreaseFontSize, DecreaseIndentation, EnterLineBreak,EnterParagraphBreak, IgnoreSpellingError, IncreaseFontSize,
IncreaseIndentation, MoveDownByLine, MoveDownByPage,
MoveDownByParagraph, MoveLeftByCharacter, MoveLeftByWord,
MoveRightByCharacter, MoveRightByWord, etc.
Uso de los Comandos desde XAML
Existen controles que incluyen y exponent la lógica de comandos por lo que
no debemos de preocuparnos de realizar ningun trabajo sobre comandos.
Estos controles implementan el interfaz ICommandSource exponiendo los
siguientes miembros:
Command
Se le asigna el comando a ejecutar.
CommandParameter
Representa un valor definido por el usuario que será pasado como parámetro
al comando.
CommandTarget
Objeto al que afecta la ejecución del comando.
En el siguiente típico ejemplo donde veremos como usar los comandos
preestablecidos de Cortar, Pegar y Copiar que afectarán a una caja de texto.
Estos comandos serán lanzados por varios botones de la barra de
herramientas.
Utilizando DataBinding asignamos como CommandTarget el elemento de tipo
TextBox y de nombre txtDocument. En Command irá cada uno de los
comandos a asignar: Cut, Copy o Paste.
<StackPanel> <ToolBar> <Button Command="Cut" CommandTarget="{Binding ElementName=txtDocument}">Cortar</Button> <Button Command="Copy" CommandTarget="{Binding ElementName=txtDocument}">Copiar</Button> <Button Command="Paste" CommandTarget="{Binding ElementName=txtDocument}">Pegar</Button> </ToolBar> <TextBox Name="txtDocument" Width="300"></TextBox> </StackPanel>
Windows Presentation Foundation provee unos tipos de eventos abstractos y desacoplados que han