Question

Je suis à la suite de la M-V-VM pour mes WPF de l'INTERFACE utilisateur.Je voudrais brancher une commande pour l'événement TextChanged d'une zone de texte à une commande qui est dans ma classe ViewModel.La seule façon que je peux concevoir que l'exécution de cette tâche est d'hériter de la zone de texte du contrôle, et de mettre en œuvre ICommandSource.Je peux ensuite demander à la commande pour être tiré à partir de l'événement TextChanged.Cela semble être trop de travail pour quelque chose qui semble si simple.

Est-il un moyen plus facile (de sous-classement de la zone de texte et la mise en œuvre de ICommandSource) pour raccorder l'événement TextChanged à mon ViewModel de la classe?

Était-ce utile?

La solution

Tout d'abord, vous avez sûrement considéré les deux sens de la liaison de données pour votre viewmodel, avec un UpdateSourceTrigger de PropertyChanged?De cette façon, la propriété setter de la propriété que vous lier à sera appelée chaque fois que le texte est modifié?

Si cela ne suffit pas, alors je voudrais s'attaquer à ce problème en utilisant des Joints de Comportements.Sur Julian Dominguez Blog, vous trouverez un l'article sur la façon de faire quelque chose de très similaire dans Silverlight, qui doit être facilement adaptable à WPF.

Pour l'essentiel, dans une classe statique (appelé, dire TextBoxBehaviours) vous définissez une Propriété Attachée appelé (peut-être) TextChangedCommand de type ICommand.Brancher un OnPropertyChanged gestionnaire de la propriété, et dans le gestionnaire, vérifier que le bien est situé sur une zone de texte;si elle l'est, ajouter un gestionnaire pour l'événement TextChanged sur la zone de texte qui appelle la commande spécifiée dans la propriété.

Ensuite, en supposant que votre viewmodel a été attribué au DataContext de votre point de Vue, vous pouvez l'utiliser comme:

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

Autres conseils

À l'aide de la liaison des événements et de la méthode de commande pourrait ne pas être la bonne chose à utiliser.Ce sera exactement cette commande?

Vous pouvez envisager d'utiliser une liaison de données pour un champ de type chaîne de votre VM.De cette façon, vous pouvez faire un appel à une commande ou une fonction à partir de là, plutôt que d'avoir l'INTERFACE utilisateur de soins à tous.

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

Vous pouvez non seulement gérer l'événement TextChanged et exécuter la commande à partir de là?

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

L'alternative, comme vous le dites, est de créer un TextBox qui agit comme une source de commande, mais cela ne sembler un peu exagéré, sauf si c'est quelque chose que vous avez l'intention sur le partage et la mise à profit de nombreux endroits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top