WPF(MVVM):从Viewmodel关闭视图?

mar*_*ith 46 wpf mvvm wpftoolkit

有人遇到过使用MVVM在视图模型中关闭视图的聪明方法吗?

也许有一种方法可以使用绑定来通知视图(窗口)关闭?

我真的很感激任何人的任何输入.

基本上我有一个绑定到loginViewModel的loginView,在viewmodel中(使用命令绑定)我测试登录是否成功,如果是,我基本上加载一个新的View(主视图)并附加其datacontext. ..

但我仍然显示loginView - 所以我需要发信号卸载..

我也希望有一个通用的解决方案,因为我确信在其他情况下我需要做这种事情

有任何想法吗?

jap*_*apf 35

编辑:有关更详细的说明,请参阅我的博文.

当我需要实现它时,我使用我创建的IRequestCloseViewModel接口.

此接口仅包含一个事件:RequestClose.ViewModel(它继承自ViewModelBase类并实现IRequestCloseViewModel)在想要关闭其关联视图时引发此事件.

在我的应用程序中,所有Window都从一个抽象类ApplicationWindow继承.每次DataContext更改时都会通知此抽象类,并在处理程序中检查DataContext是否支持IRequestCloseViewModel.如果是这种情况,则会设置事件处理程序以在触发事件时关闭Window.

或者,像肯特所说,你可以使用屏幕控制器在外部类中处理这种机制.


Rya*_*ver 22

不确定您使用的MVVM框架,但大多数都包含某种消息/通知解决方案,这些解决方案很容易为发送的消息注册.没有理由我可以想象你的视图无法注册诸如"CloseWindowsBoundTo"和viewModel作为发送者的消息.然后在您的视图中,您可以注册该消息,并将您当前的datacontext与发件人进行比较.如果匹配,请关闭窗口.

简单,并保持从视图模型中抽象出来的视图.

这将是我使用MVVM-light工具包的方法:

在ViewModel中:

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

并在视图中:

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


cjm*_*rph 9

我知道这是一个老问题,但我有一个很好的方法,所以我想我会分享给其他任何绊倒这个的人.我曾经使用dialogcloser附加行为,但我发现下面的解决方案更容易使用它.为简单起见,下面的示例以窗口上的关闭按钮为例.

将窗口作为命令参数传递.

在按钮xaml中查看:

CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
Run Code Online (Sandbox Code Playgroud)

在视图模型中的命令execute方法中:

if (parameter is System.Windows.Window)
{
    (parameter as System.Windows.Window).Close();
}
Run Code Online (Sandbox Code Playgroud)


Ken*_*art 8

通常,您会使用某种控制器/演示者/服务来驱动屏幕激活/停用.MVVM并不是一种统治它们的模式.您需要在任何非平凡的应用程序中将其与其他模式结合使用.

也就是说,在某些情况下,有一个视图模型可以管理子视图模型的生命周期.例如,您可能拥有一个EditorViewModel管理子视图模型集合的集合 - 每个模型对应一个正在编辑的文档.在这种情况下,只需在此集合中添加/删除可以导致视图激活/停用.但这听起来并不适合您的用例.


Ada*_*lls 7

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>