1
votes

WPF a perdu la mise au point ne se déclenche pas lorsque vous appuyez sur un bouton

il s'agit du code XAML d'une zone de liste déroulante modifiable pour la saisie / la sélection d'IP.

<ComboBox Name="ComboBoxServerIp" 
    Grid.Row="2"  Grid.Column="1"                                                            
    ItemsSource="{Binding ServerList}"          
    Text="{Binding SelectedServer, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"
    IsEditable="True" IsReadOnly="False">
    <ComboBox.InputBindings>
        <KeyBinding Command="{Binding UpdateServerIpCommand}" Key="Enter"
                    CommandParameter="{Binding ElementName=ComboBoxServerIp ,Path=Text}"/>
    </ComboBox.InputBindings>   
</ComboBox>

une fois que l'utilisateur a terminé d'entrer l'IP, il déclenche un flux qui prend environ 10 secondes. j'ai donc utilisé une combinaison de perte de mise au point et de touche entrée enfoncée pour déclencher une mise à jour.

cela fonctionne bien à l'exception du cas d'utilisation lorsqu'un utilisateur appuie sur un bouton sans d'abord perdre le focus ou en appuyant sur Entrée. dans ce cas, la mise à jour de SelecterServer n'est pas déclenchée. AVANT L'EXÉCUTION DE LA COMMANDE DU BOUTON . la commande lit l'ancienne valeur SelectedServer. pas celui de l'interface utilisateur

tl; dr - événement lostfocus non déclenché dans la zone de texte lorsque vous appuyez sur un bouton de l'interface utilisateur. comment puis-je forcer une mise à jour du côté de l'interface utilisateur?


4 commentaires

Je ne peux pas reproduire le problème. Si je clique sur un bouton dans l'interface utilisateur, la valeur a été entrée dans la zone de liste déroulante étant définie sur la propriété liée. Mettez un point d'arrêt dans le setter SelectedServer .


@Rekshino a ajouté une clarification: le bouton lit la valeur de SelectedServer


Hmm .. De mon côté, le setter de propriété lié avec Text est frappé en premier, avant que la commande ne soit exécutée. J'ai une liaison habituelle pour le bouton: Command = "{Binding ...}"


Pourquoi avez-vous besoin de définir la propriété lorsque le focus est perdu en premier lieu? Votre propriété source ne doit déclencher aucun flux. Une commande devrait.


4 Réponses :


0
votes

Essayez ceci

Text="{Binding SelectedServer, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

ou si ce n'est pas une option, alors peut-être une propriété jointe comme sur cette réponse WPF - Définir le focus lorsqu'un bouton est cliqué - Aucun code derrière


1 commentaires

J'ai besoin de changer quand je perds la concentration.



0
votes

a trouvé un message sur le problème exactement opposé, Problème WPF Lost-Focus dans le même contrôle .

l'opposé de ce correctif a parfaitement fonctionné pour moi ajoutez cette propriété au bouton:

Focusable="False"

l'événement lostFocus est déclenché avant l'événement cliqué sur le bouton. tout fonctionne comme prévu.


0 commentaires

0
votes

J'ai eu le même cas, où j'utilisais la grille et les thèmes de Telerik et j'ai eu le même problème où mon GridViewComboBoxColumn ne mettrait pas à jour la valeur avant que l'événement de clic du bouton ne soit déclenché et que vous deviez cliquer ailleurs auparavant ou les données ne le feraient pas être sauvé.

Dans mon cas, j'ai l'opposé du awnser de DanW25 et j'avais défini ma propriété Buttons Focusable sur False pour résoudre quelque chose dans le thème. J'ai défini la propriété Focusable du bouton Enregistrer sur True et maintenant tout fonctionne à nouveau.


0 commentaires

0
votes

Avez-vous implémenté l'interface INotifyPropertyChanged dans le ViewModel ? Cela pourrait vous aider à résoudre votre problème. J'ai eu un problème similaire où je saisissais des données dans une TextBox puis sans cliquer ailleurs, je cliquais sur le bouton qui déclencherait une commande mais j'avais toujours l'ancienne valeur dans la propriété et non le un de l'interface utilisateur. Une fois que j'ai implémenté l'interface INotifyPropertyChanged , cela a bien fonctionné.


0 commentaires