J'ai une boîte de dialogue qui apparaît sur l'écran principal (c'est un contrôle utilisateur qui apparaît sur la page selon la démo d'application de Billy Hollis) dans mon application qui contient des données de l'écran principal à éditer. L'écran principal est en lecture seule. Le problème que j'ai, c'est que lorsque je change les données dans la boîte de dialogue, les données de l'écran principal sont également mises à jour. De toute évidence, ils sont liés au même objet, mais existe-t-il un moyen d'arrêter la mise à jour de liaison jusqu'à ce que je clique sur Enregistrer dans ma boîte de dialogue?Comment arrêter la mise à jour des propriétés de liaison?
Répondre
Vous pouvez utiliser un :
...
<StackPanel Name="panel">
<StackPanel.BindingGroup>
<BindingGroup Name="bindingGroup"/>
</StackPanel.BindingGroup>
<TextBox Text="{Binding Foo}"/>
<TextBox Text="{Binding Bar}"/>
<Button Name="btnSubmit" Content="Submit" OnClick="btnSubmit_Click"/>
<Button Name="btnCancel" Content="Cancel" OnClick="btnCancel_Click"/>
</StackPanel>
...
code derrière:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
panel.BindingGroup.BeginEdit();
}
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
panel.BindingGroup.CommitEdit();
panel.BindingGroup.BeginEdit();
}
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
panel.BindingGroup.CancelEdit();
panel.BindingGroup.BeginEdit();
}
La seule manière que je l'ai vu faire est la façon dont Josh Smith mentionne here avec convertisseurs. Ce n'est pas la méthode la plus simple.
Regardez la propriété Binding.UpdateSourceTrigger.
Vous pouvez définir la Binding
dans votre boîte de dialogue comme si
<TextBox Name="myTextBox"
Text={Binding Path=MyProperty, UpdateSourceTrigger=Explicit} />
Et puis appelez la méthode UpdateSource dans votre bouton Enregistrer événement
myTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
Une fois que vous avez appelé UpdateSource
l'objet source sera mis à jour avec la valeur du TextBox
J'ai essayé mais ça ne marche pas. Il met toujours à jour le TextBlock sur l'écran principal. L'option Explicit indique qu'elle ne sera mise à jour que lorsque la méthode UpdateSource sera appelée, mais pas dans ce cas. –
Vraiment? Je suis surpris. Je l'ai juste essayé et ça marche pour moi. Peut-être qu'il y a quelque chose d'autre dans votre application qui cause des problèmes? – Ray
Cela fonctionne définitivement, mais vous devez parcourir toutes les liaisons pour appeler UpdateSource() sur chacune d'elles. Le moyen le plus simple de le faire est d'associer les liaisons à un BindingGroup. En prime, UpdateSourceTrigger est défini sur Explicit sur les liaisons associées implicitement. – Lu55
Je choisis également d'utiliser BindingGroup. Mais à la place du modèle BeginEdit()
/CommitEdit()
/CancelEdit()
, j'appelle UpdateSource()
explicitement sur toutes les liaisons associées à BindingGroup. Cette approche me permet d'ajouter un seul gestionnaire d'événements au lieu de 3.
private void OkButton_Click(object sender, RoutedEventArgs e)
{
CommitChanges();
DialogResult = true;
Close();
}
private void CommitChanges()
{
foreach (var bindingExpression in this.BindingGroup.BindingExpressions)
{
bindingExpression.UpdateSource();
}
}
L'article Edit With Explicit UpdateSourceTrigger vous donnera plus d'informations sur la façon de mettre en œuvre Enregistrer et Annuler avec UpdateSourceTrigger=Explicit
.
- 1. Mise à jour des propriétés remplies uniquement
- 2. Mise à jour automatique de la liaison de données
- 3. Mise à jour des propriétés de base - ASP.NET MVC- C#
- 4. Problème lors de la mise à jour des propriétés des tâches de workflow d'une partie Web
- 5. Problème de liaison WPF avec la mise à jour des valeurs
- 6. Liaison à un objet à mise à jour automatique?
- 7. Propriétés WebPart Mise à jour à l'aide RunWithElevatedPrivileges MOSS 2007
- 8. Liaison Wpf à la classe avec des propriétés inconnues Nombre
- 9. Mise à jour des modèles
- 10. Comment mettre à jour les propriétés de la sous-version
- 11. Rendre les propriétés ViewModel visibles à la liaison dans Silverlight
- 12. Deux propriétés « auto-mise à jour » dans WPF MVVM
- 13. Comment avoir une mise à jour de liaison WPF chaque seconde?
- 14. Problème de liaison de données avec la classe qui est mise à jour de manière asynchrone
- 15. Quand la cible de liaison est-elle mise à jour pour les chemins complexes?
- 16. Mise à jour des tables de liens
- 17. Mise à jour des déclencheurs de panneau
- 18. Propriétés de liaison XAML
- 19. git - mise à jour à la nouvelle branche des rails
- 20. Animate WPF Texte lors de la mise à jour des liens, comment?
- 21. Visual Studio arrêter la mise à jour automatique sur les références
- 22. Mise à jour de la version
- 23. Mise à jour de liaison de données lorsque la valeur change, pas en cas de tabulation
- 24. Drupal: la mise à jour avec Drush ne change pas l'état de la mise à jour
- 25. Mise à jour des contrôles liés à ApplicationSettings
- 26. Comment refactoriser des requêtes de mise à jour SQL répétitives?
- 27. .net Liaison de données - Référencement des propriétés de type anonyme
- 28. mise à jour datagridview
- 29. Comment appeler une fonction après la fin de la mise à jour dans un panneau de mise à jour?
- 30. Mise à jour de Nulls
Bonne idée! Je n'ai eu ce travail que si j'ai déclaré le groupe dans chaque déclaration contraignante. C'est cependant beaucoup plus facile que les autres alternatives. – Telavian