example commandmanager wpf mvvm command event-binding

wpf - commandmanager - TextBox.TextChanged e ICommandSource



icommand wpf (3)

Estoy siguiendo el patrón MV-VM para mi interfaz de usuario de WPF. Me gustaría conectar un comando al evento TextChanged de un TextBox a un comando que está en mi clase ViewModel. La única forma en que puedo concebir completar esta tarea es heredar del control TextBox e implementar ICommandSource. Luego puedo ordenar al comando que se active desde el evento TextChanged. Esto parece ser demasiado trabajo para algo que parece ser tan simple.

¿Hay alguna manera más fácil (que subclasificar el TextBox e implementar ICommandSource) para conectar el evento TextChanged a mi clase ViewModel?


¿No puedes manejar el evento TextChanged y ejecutar el comando desde allí?

private void _textBox_TextChanged(object sender, EventArgs e) { MyCommand.Execute(null); }

La alternativa, como dices, es crear un TextBox que actúe como un origen de comando, pero eso parece exagerado a menos que sea algo que planees compartir y aprovechar en muchos lugares.


En primer lugar, seguramente ha considerado el enlace de datos bidireccional a su modelo de vista, con un UpdateSourceTrigger de PropertyChanged? De esta forma, ¿se llamará al establecimiento de la propiedad a la que se vincula cada vez que se cambie el texto?

Si eso no es suficiente, entonces abordaría este problema utilizando Comportamientos Vinculados. En el blog de Julian Domínguez encontrarás un artículo sobre cómo hacer algo muy similar en Silverlight, que debería ser fácilmente adaptable a WPF.

Básicamente, en una clase estática (llamada, digamos TextBoxBehaviours) define una propiedad adjunta llamada (quizás) TextChangedCommand de tipo ICommand. Conecte un controlador OnPropertyChanged para esa propiedad, y dentro del controlador, verifique que la propiedad se establezca en un TextBox; si es así, agregue un controlador al evento TextChanged en el cuadro de texto que llamará al comando especificado en la propiedad.

Luego, suponiendo que su modelo de vista se haya asignado al DataContext de su Vista, lo usaría como:

<TextBox x:Name="MyTextBox" TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />


Usar el enlace de eventos y el método de comando puede no ser lo correcto para usar. ¿Qué hará exactamente este comando?

Es posible que desee considerar el uso de un enlace de datos a un campo de cadena en su máquina virtual. De esta forma, puede realizar una llamada a un comando o función desde allí en lugar de tener cuidado de la IU en absoluto.

<TextBox Text="{Binding WorldName}"/> .... public string WorldName { get { return WorldData.Name; } set { WorldData.Name = value; OnPropertyChanged("WorldName"); // CallYourCustomFunctionHere(); } }