Comment puis-je dire à mon ViewModel que l'utilisateur change de texte dans la zone de texte?

StackOverflow https://stackoverflow.com/questions/1013208

  •  06-07-2019
  •  | 
  •  

Question

Supposons donc que j'ai une application MVVM et que je souhaite que l'utilisateur remplisse une zone de texte et pendant qu'il la remplit , Je souhaite vérifier s'il a déjà saisi le nom d'un client.

Voici comment j'obtiens mon ViewModel lorsque l'utilisateur a modifié l'élément dans la zone de liste déroulante :

<ComboBox 
    ItemsSource="{Binding Customers}"
    ItemTemplate="{StaticResource CustomerComboBoxTemplate}"
    Margin="20"
    HorizontalAlignment="Left"
    SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"/>

Voici comment j'obtiens mon ViewModel lorsque l'utilisateur a déplacé le curseur :

<Slider Minimum="0" 
        Margin="10"
        Width="400"
        IsSnapToTickEnabled="True"
        Maximum="{Binding HighestCustomerIndex, Mode=TwoWay}" 
        Value="{Binding SelectedCustomerIndex, Mode=TwoWay}"/>

Et voici comment j'obtiens mon ViewModel pour savoir quand l'utilisateur a changé le texte dans la zone de texte et déplacé le focus de la zone de texte:

<TextBox
    Width="200"
    Text="{Binding TypedCustomerName}"/>

Mais comment faire en sorte que mon ViewModel soit informé du moment où l'utilisateur a modifié le texte dans la zone de texte lors de la frappe , par exemple. quelque chose comme ceci:

PSEUDO-CODE (provoque une erreur car TextChanged est un événement):

<TextBox
    Width="200"
    TextChanged="{Binding CurrentTextInTextBox}"/>
Était-ce utile?

La solution

Si vous le souhaitez, au lieu de mettre à jour le ViewModel uniquement lorsque la zone de texte a perdu le focus, vous pouvez le configurer pour qu'il se mette à jour au fur et à mesure de la frappe. UpdateSourceTrigger sur la propriété de liaison de texte de TextBox est défini sur LostFocus par défaut au lieu de PropertyChanged, comme la plupart des autres contrôles, mais vous pouvez le définir explicitement dans la liaison. Ainsi, la propriété TypedCustomerName dans la VM ou M sera mise à jour à mesure qu’elle est modifiée dans l’UI.

<TextBox
Width="200"
Text="{Binding TypedCustomerName, UpdateSourceTrigger=PropertyChanged}"/>

Si ce n'est pas ce que vous cherchez, vous pouvez également utiliser AttachedCommandBehaviors pour lier l’événement routé TextChanged à une ICommand existant dans votre modèle de vue.

Autres conseils

TextBoxex utilise par défaut la mise à jour sur LostFocus. Définissez UpdateSourceTrigger = " PropertyChanged " mettre à jour lorsque l'utilisateur tape.

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