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
Mary-Kate Olsenoriginal
2025-01-23 02:51:09293parcourir

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.

<code class="language-csharp">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>

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

<code class="language-xml"><Window ... xc:DialogCloser.DialogResult="{Binding DialogResult}" xmlns:xc="clr-namespace:ExCastle.Wpf"></Window></code>

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

<code class="language-csharp">public class MyViewModel : INotifyPropertyChanged
{
    ...
    private bool? _dialogResult;
    public bool? DialogResult
    {
        get { return _dialogResult; }
        set
        {
            _dialogResult = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DialogResult)));
        }
    }
    ...
}</code>

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