Pregunta

Estoy siguiendo el M-V-VM patrón para mi IU de WPF.Me gustaría conectar un comando para el evento TextChanged de un TextBox a un comando que está en mi clase ViewModel.La única manera en que puedo concebir la realización de esta tarea es para heredar el control de cuadro de texto, y aplicar ICommandSource.A continuación, puedo indicar al comando para ser disparada desde el evento TextChanged.Esto parece ser demasiado trabajo para algo que parece ser tan simple.

Hay una manera más fácil (de subclases de la caja de texto y la aplicación de ICommandSource) para enlazar el evento TextChanged a mi clase ViewModel?

¿Fue útil?

Solución

En primer lugar, seguramente has considerado enlace de datos bidireccional a su viewmodel, con un UpdateSourceTrigger de PropertyChanged?De esa manera el establecedor de la propiedad de los bienes que se unen a será llamado cada vez que se cambia el texto?

Si eso no es suficiente, entonces me gustaría abordar este problema a través de Adjuntos de Comportamientos.Julián Domínguez del Blog podrás encontrar una artículo acerca de cómo hacer algo muy similar en Silverlight, que debe ser fácilmente adaptable a WPF.

Básicamente, en una clase estática (llama, dicen TextBoxBehaviours) definir una Propiedad Adjunta llamado (tal vez) TextChangedCommand de tipo ICommand.Enlazar un OnPropertyChanged controlador para esa propiedad, y en el controlador, compruebe que la propiedad se establece en un cuadro de texto;si es así, añadir un manejador para el evento TextChanged en el cuadro de texto que se llame el comando especificado en la propiedad.

Entonces, asumiendo que su viewmodel ha sido asignado a la DataContext de su Vista, se podría utilizar como:

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

Otros consejos

Utilizando el enlace de eventos y comandos método puede no ser lo correcto a utilizar.Qué exactamente este comando hacer?

Usted puede ser que desee considerar el uso de un Enlace de datos para un campo de cadena de caracteres en la VM.De esta manera usted puede hacer una llamada a un comando o función de allí en lugar de tener la interfaz de usuario de atención en todo.

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

Puede que usted no sólo 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 para crear un TextBox que actúa como una fuente de mando, pero que hace parecer excesiva a menos que sea algo que esté en la planificación de compartir y aprovechar en muchos lugares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top