Maison > développement back-end > C++ > Comment fermer un formulaire WPF à partir du ViewModel dans MVVM ?

Comment fermer un formulaire WPF à partir du ViewModel dans MVVM ?

Mary-Kate Olsen
Libérer: 2025-01-23 02:51:09
original
353 Les gens l'ont consulté

How to Close a WPF Form from the ViewModel in MVVM?

Dans le modèle de conception MVVM de WPF, un défi courant consiste à savoir comment fermer une vue (par exemple, un formulaire) à partir du ViewModel. ViewModel est généralement responsable de la gestion de la logique métier, tandis que les vues sont responsables de l'affichage de l'interface utilisateur (UI).

Problème : ViewModel manque de connaissances en matière de vue

De par sa conception, ViewModel ne doit pas avoir une connaissance directe de la vue. Cela garantit la séparation des préoccupations et permet l’indépendance de l’assurance-chômage. Cependant, la fermeture du formulaire nécessite d'accéder à la vue, ce qui peut poser problème.

Solutions communes

Méthode CodeBehind traditionnelle : Cela implique de placer le code pour fermer le formulaire dans le fichier codebehind de la vue. Cela viole le modèle MVVM et introduit un couplage entre la vue et le ViewModel.

Propriétés supplémentaires avec déclencheurs de style : Vous pouvez définir une propriété jointe sur un formulaire et utiliser un déclencheur de style pour fermer le formulaire lorsque la propriété jointe est définie. Bien que cette solution adhère aux principes MVVM, elle implique du code supplémentaire et peut s'avérer fastidieuse.

Solution simplifiée : attributs supplémentaires de DialogCloser

Vous pouvez créer une propriété jointe personnalisée appelée DialogCloser pour simplifier ce processus. Cette propriété prend un paramètre bool? qui représente le DialogResult du formulaire. Lorsque la valeur de cette propriété est définie, elle définit automatiquement la propriété DialogResult de l'objet Window contenant le formulaire.

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

Pour utiliser cet attribut, appliquez-le simplement à l'élément Window dans votre vue XAML :

<Window ... xc:DialogCloser.DialogResult="{Binding DialogResult}" xmlns:xc="clr-namespace:ExCastle.Wpf"></Window>
Copier après la connexion

Dans le ViewModel, liez la propriété DialogResult à une propriété booléenne :

public class MyViewModel : INotifyPropertyChanged
{
    ...
    private bool? _dialogResult;
    public bool? DialogResult
    {
        get { return _dialogResult; }
        set
        {
            _dialogResult = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DialogResult)));
        }
    }
    ...
}
Copier après la connexion

Lorsque la propriété DialogResult est définie dans un ViewModel, la propriété DialogCloser attachée met automatiquement à jour le DialogResult de l'objet Window conteneur, fermant ainsi le formulaire.

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 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