47 votes

WPF (MVVM): Fermer une vue de Viewmodel?

Personne de trouver un moyen astucieux de la fermeture d'un point de vue dans viewmodel en utilisant MVVM?

Peut-être il ya un moyen de l'utilisation de la liaison de signal de la vue (fenêtre) pour fermer?

Je voudrais vraiment apprécier toutes les entrées quelqu'un a de.

Fondamentalement, j'ai un loginView qui est lié à un loginViewModel, dans le viewmodel (à l'aide de la liaison sur une commande), je test pour voir si la connexion est réussie et si c'est en gros, je charge un nouveau point de Vue (mainview) et joindre son datacontext...

mais j'ai toujours le loginView indiqué - si j'ai besoin de signal pour décharger..

J'ai aussi été en espérant pour une solution générique, car je suis sûr que je vais avoir besoin de faire ce genre de chose dans d'autres situations

Des idées?

36voto

Jalfp Points 3018

Edit: Voir mon blog pour une explication plus détaillée.

Quand j'en ai besoin pour cela j'utilise un IRequestCloseViewModel interface que j'ai créé.

Cette interface contient un seul événement: RequestClose. Cet événement est déclenché par le ViewModel (qui hérite d'une classe ViewModelBase ET de mettre en œuvre IRequestCloseViewModel) quand il veut fermer son de la vue associée.

Dans mon application, la Fenêtre hérite d'une classe abstraite ApplicationWindow. Cette classe abstraite est notifié à chaque fois que le DataContext changé et dans le gestionnaire vérifie si le DataContext de soutien de la IRequestCloseViewModel. Si c'est le cas, un gestionnaire d'événement est mis en place pour fermer la Fenêtre lorsque l'événement est déclenché.

Sinon, comme Kent dit, vous pouvez utiliser le contrôleur de l'écran qui manipulent ce mécanisme dans une classe externe.

24voto

Ryan from Denver Points 661

Pas sûr de ce que MVVM framework que vous utilisez, mais la plupart contiennent une sorte de messagerie / solution de notification qui est facile d'avoir des choses à vous inscrire pour les messages qui sont envoyés. Il n'y a pas de raison que je ne peux imaginer que votre vue n'a pas pu inscrire un message tel que "CloseWindowsBoundTo" et le viewModel l'expéditeur. Alors à votre avis, vous pouvez simplement vous inscrire pour ce message, et de comparer votre datacontext à l'expéditeur. Si elles correspondent, fermez la fenêtre.

Simple, et maintient votre vue abstraite de votre viewmodel.

Ici serait mon approche en utilisant MVVM-light toolkit:

Dans le ViewModel:

public void notifyWindowToClose()
{
    Messenger.Default.Send<NotificationMessage>(
        new NotificationMessage(this, "CloseWindowsBoundToMe")
    );
}

Et dans la Vue:

Messenger.Default.Register<NotificationMessage>(this, (nm) =>
{
    if (nm.Notification == "CloseWindowsBoundToMe")
    {
        if (nm.Sender == this.DataContext)
            this.Close();
    }
});

8voto

Kent Boogaart Points 97432

Généralement, vous utilisez une sorte de contrôleur/présentateur/service à conduire l'écran d'activation/désactivation. MVVM n'est pas destiné à être Un Modèle pour les gouverner Tous. Vous aurez besoin de le combiner avec d'autres modèles dans toute non-trivial de l'application.

Cela dit, dans certaines situations, fait sens d'avoir un modèle de vue qui gère le cycle de vie de l'enfant les modèles de vue. Par exemple, vous pourriez avoir un EditorViewModel qui gère une collection d'enfant de voir les modèles - l'un pour chaque document en cours d'édition. Dans ce cas, il suffit d'ajouter/supprimer/à partir de cette collection peut entraîner l'affichage de l'activation/désactivation. Mais cela ne sonne pas comme il convient à votre cas d'utilisation.

7voto

Adam Mills Points 1645

http://adammills.wordpress.com/2009/07/01/window-close-from-xaml/

<Style.Triggers> <DataTrigger Binding="{Binding CloseSignal}" Value="true"> <Setter Property="Behaviours:WindowCloseBehaviour.Close" Value="true" /> </DataTrigger> </Style>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X