Dans les applications MVVM, la gestion de la fermeture du formulaire peut être difficile car le ViewModel ne connaît pas la vue réelle. Cet article explore une solution élégante utilisant les propriétés attachées pour fermer de manière transparente un formulaire à partir d'un ViewModel.
Considérez un formulaire de connexion typique dans lequel le ViewModel contient les informations d'identification de l'utilisateur. Lors de la soumission de la commande de connexion, le ViewModel démarre l'opération de connexion :
Pour relever ce défi, nous pouvons exploiter une propriété supplémentaire pour combler le fossé entre ViewModel et View :
<code class="language-xml"><Window ... DialogResult="{Binding DialogResult, Source={StaticResource ViewModel}}" xmlns:xc="clr-namespace:ExCastle.Wpf"> </Window></code>
Cette propriété lie la propriété DialogResult du ViewModel à la propriété DialogResult de la fenêtre. Lorsque le ViewModel modifie le DialogResult, la propriété attachée met automatiquement à jour le DialogResult de la fenêtre et ferme le formulaire en conséquence.
Voici le code de l'attribut attaché :
<code class="language-csharp">using System.Windows; namespace ExCastle.Wpf { public static class DialogCloser { public static readonly DependencyProperty DialogResultProperty = DependencyProperty.RegisterAttached( "DialogResult", typeof(bool?), typeof(DialogCloser), new PropertyMetadata(DialogResultChanged)); private static void DialogResultChanged( DependencyObject d, DependencyPropertyChangedEventArgs e) { var window = d as Window; if (window != null) window.DialogResult = e.NewValue as bool?; } public static void SetDialogResult(Window target, bool? value) { target.SetValue(DialogResultProperty, value); } } }</code>
Dans le ViewModel, implémentez simplement INotifyPropertyChanged et mettez à jour la propriété DialogResult lorsque la connexion est réussie :
<code class="language-csharp">private bool? _dialogResult; public bool? DialogResult { get { return _dialogResult; } set { _dialogResult = value; OnPropertyChanged(nameof(DialogResult)); } } // 登录命令逻辑 public ICommand LoginCommand { get; set; }</code>
Cette approche résout élégamment le problème de fermeture de formulaire sans affecter les principes MVVM. Le ViewModel reste découplé de la vue tout en contrôlant efficacement la fermeture du formulaire via une simple liaison de propriété.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!