Maison >développement back-end >C++ >Comment puis-je fermer un formulaire WPF à partir du ViewModel à l'aide d'une propriété attachée dans MVVM ?

Comment puis-je fermer un formulaire WPF à partir du ViewModel à l'aide d'une propriété attachée dans MVVM ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-23 02:44:11246parcourir

How Can I Close a WPF Form from the ViewModel Using an Attached Property in MVVM?

Fermez le formulaire WPF dans MVVM en utilisant les propriétés jointes

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.

Dilemme

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 :

  • Après une connexion réussie, le formulaire de connexion doit être fermé et un DialogResult valide renvoyé.
  • Lorsque la connexion est invalide, un message d'erreur s'affichera et le formulaire restera ouvert.

Brisez les barrières avec des attributs supplémentaires

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.

Mise en œuvre du code

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>

Simplicité et pureté

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn