vez una tutorial que propiedades propiedad mas etiquetas establecida esta español ejemplos content c# wpf xaml commandbinding

una - xaml c# tutorial español



WPF: Ejecuta un enlace de comando en un campo de búsqueda al presionar el botón enter (4)

Tengo un campo de búsqueda en mi aplicación WPF con un botón de búsqueda que contiene un enlace de comando. Esto funciona muy bien, pero ¿cómo puedo usar el mismo enlace de comando para el campo de texto al presionar Enter en el teclado? Los ejemplos que he visto están usando el código detrás con un manejador de eventos KeyDown. ¿Hay alguna manera inteligente de hacer que esto funcione solo con xaml y el enlace del comando?


Intenté con la solución TextBox.Inputs de Greg Samson, pero recibí un error que decía que solo podía enlazar a textinputs a través de una propiedad de dependencia. Al final, he encontrado la siguiente solución para esto.

Crea una clase llamada CommandReference que se vea así:

public class CommandReference : Freezable, ICommand { public CommandReference() { // } public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandReference), new PropertyMetadata(new PropertyChangedCallback(OnCommandChanged))); public ICommand Command { get { return (ICommand)GetValue(CommandProperty); } set { SetValue(CommandProperty, value); } } #region ICommand Members public bool CanExecute(object parameter) { if (Command != null) return Command.CanExecute(parameter); return false; } public void Execute(object parameter) { Command.Execute(parameter); } public event EventHandler CanExecuteChanged; private static void OnCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { CommandReference commandReference = d as CommandReference; ICommand oldCommand = e.OldValue as ICommand; ICommand newCommand = e.NewValue as ICommand; if (oldCommand != null) { oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged; } if (newCommand != null) { newCommand.CanExecuteChanged += commandReference.CanExecuteChanged; } } #endregion #region Freezable protected override Freezable CreateInstanceCore() { throw new NotImplementedException(); } #endregion }

En Xaml, agregue esto a los recursos de UserControl:

<UserControl.Resources> <Base:CommandReference x:Key="SearchCommandRef" Command="{Binding Path = SomeCommand}"/>

El TextBox actual se ve así:

<TextBox Text="{Binding Path=SomeText}"> <TextBox.InputBindings> <KeyBinding Command="{StaticResource SearchCommandRef}" Key="Enter"/> </TextBox.InputBindings> </TextBox>

No recuerdo de dónde obtuve este código, pero este sitio lo explica también;

http://www.netframeworkdev.com/windows-presentation-foundation-wpf/invoke-a-command-with-enter-key-after-typing-in-a-textbox-21909.shtml


La implementación de referencia Prism contiene una implementación de exactamente lo que buscas.

Los pasos básicos son:

  • Crear una clase estática EnterKey
  • Propiedad registrada "Comando" de tipo ICommand en EnterKey
  • Propiedad adjunta registrada "EnterKeyCommandBehavior" de tipo EnterKeyCommandBehavior en EnterKey
  • Cuando el valor de "Comando" cambia, adjunte "EnterKeyCommandBehavior" al control como una nueva instancia de EnterKeyCommandBehavior, y asigne ICommand a la propiedad Comando del comportamiento.
    • Si el comportamiento ya está adjunto, use la instancia existente
  • EnterKeyCommandBehavior acepta un UIElement en el constructor y se conecta al PreviewKeyDown (o KeyDown si desea permanecer compatible con Silverlight).
  • En el controlador de eventos, si la clave es Enter, ejecute ICommand (si CanExecute es verdadero).

Esto le permite usar el comportamiento de esta manera:

<TextBox prefix:EnterKey.Command="{Binding Path=SearchCommand}" />


La respuesta aceptada solo funciona si ya tiene un botón vinculado al comando.

Para evitar esta limitación, use TextBox.InputBindings:

<TextBox.InputBindings> <KeyBinding Key="Enter" Command="{Binding Path=MyCommand}"></KeyBinding> </TextBox.InputBindings>


Puede usar la propiedad IsDefault del botón:

<Button Command="SearchCommand" IsDefault="{Binding ElementName=SearchTextBox, Path=IsKeyboardFocused}"> Search! </Button>