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
Libérer: 2025-01-23 02:44:11
original
189 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal