Wpf 谁负责MVVM模式中的窗口视图生命周期?

Wpf 谁负责MVVM模式中的窗口视图生命周期?,wpf,mvvm,Wpf,Mvvm,我不清楚是谁在WPF中创建和处理窗口。 正如我们所知,可以通过单击右上角的十字符号来关闭窗口,并且只有在关闭事件处理程序中设置Cancel=true才能停止关闭窗口。 对我来说,由ViewModel决定是否允许关闭视图是很自然的。我认为是VM请求相应窗口的实例化。 在我们的项目中,我们创建了IViewManager: public interface IViewManager { void ShowView(); void CloseView(); } public inter

我不清楚是谁在WPF中创建和处理窗口。
正如我们所知,可以通过单击右上角的十字符号来关闭窗口,并且只有在关闭事件处理程序中设置Cancel=true才能停止关闭窗口。
对我来说,由ViewModel决定是否允许关闭视图是很自然的。我认为是VM请求相应窗口的实例化。
在我们的项目中,我们创建了
IViewManager

public interface IViewManager
{
    void ShowView();
    void CloseView();
}

public interface IWindowedViewModel : IDisposable
{
    bool IsEnabled {get;set;}
    WindowState WindowState {get;set;}
    Visibility Visibility {get;set;}
    bool IsActive {get;set;}

    bool CanBeClosed();
}
因此,我们的虚拟机通过绑定和通过
IViewManager
间接与视图通信。 在我迄今为止看到的MVVM应用程序示例中,VM相当被动,不负责视图的生命周期。这就是为什么我对我们的设计有些怀疑。

我不确定我们是否遗漏了有关MVVM模式的重要内容。

因此,您必须修改窗口,使其具有绑定到ViewModel的布尔类型依赖属性,如CanSave(此属性将说明是否有任何挂起的更改)。现在,如果CanSavetrue,您将向用户显示一个对话框,其中显示“是否要保存挂起的更改”,如果用户单击Yes,则触发与保存按钮相同的命令,如果用户单击No只需关闭窗口。如果CanSavefalse只需关闭窗口。我希望这会给您一个想法


另一种方法是自定义“窗口关闭”按钮,并通过命令将其绑定到ViewModel,然后从那里进行处理。

如果我没有理解错您的问题,那么我认为视图(窗口/用户控制)本身就是其生命周期的责任。视图确实通过DataContext引用VM,当窗口关闭时,它将被释放,因此您的VM将被释放。@ethicalogica但当视图(窗口)在逻辑上被禁止时,有一个关闭视图(窗口)的选项:例如,我们有一些未保存的更改。我们应该如何正确处理这种情况?很好。视图(而不是虚拟机)可以启动与用户的对话吗?在虚拟机中,我们可以动态地决定要做什么:显示对话框,询问一些服务,从而管理执行流,如果我没有弄错的话,虚拟机究竟要负责什么。我看不出有任何问题,如果对话框不允许用户在对话框打开时与相应的视图交互。