Dans mon application, j'utilise prism et j'essaie d'implémenter le concept suivant :
Il y a une fenêtre de communication qui peut avoir deux contrôles utilisateur possibles. J'ai les ViewModels pour la fenêtre et les contrôles d'utilisateur. Dans chaque contrôle utilisateur, j'ai des boutons. Pour certains boutons, j'ai besoin d'exécuter une certaine logique dans le ViewModel et lorsque la logique est terminée, fermer la fenêtre parente. J'ai essayé d'envoyer la fenêtre parant comme paramètre de commande comme ceci :
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
Et dans le viewModel, fermez la fenêtre en utilisant le code suivant :
// Create the command
OpenChannelCommand = new RelayCommand(OpenChannel, IsValidFields);
...
private void OpenChannel()
{
// do some logic...
CloseWindow();
}
private GalaSoft.MvvmLight.Command.RelayCommand<object> _closeCommand;
private GalaSoft.MvvmLight.Command.RelayCommand<object> CloseWindow()
{
_closeCommand = new GalaSoft.MvvmLight.Command.RelayCommand<object>((o) => ((Window)o).Close(), (o) => true);
return _closeCommand;
}
Mais la fenêtre ne se referme toujours pas.
EDIT :
Le code XAML du contrôle de l'utilisateur est :
<Button Content="Open Channel" Command="{Binding OpenChannelCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
Le code du ViewModel du contrôle utilisateur est :
public RelayCommand OpenChannelCommand { get; set; }
ctor()
{
OpenChannelCommand = new RelayCommand(OpenChannel, IsValidFields);
}
private void OpenChannel()
{
// logic
CloseWindow();
}
private GalaSoft.MvvmLight.Command.RelayCommand<object> CloseWindow()
{
_closeCommand = new GalaSoft.MvvmLight.Command.RelayCommand<object>((o) => ((Window)o).Close(), (o) => true);
return _closeCommand;
}
C'est l'implémentation complète que j'ai actuellement essayé. Lorsque je place un point d'arrêt sur la méthode CloseWindow, il se produit à l'initialisation du mode de vue et après l'avoir appelé à nouveau dans la commande de clic du bouton, il ne fait rien.