WPF(MVVM):从视图模型关闭一个看法?(WPF (MVVM): Closing a view

2019-07-19 19:16发布

任何人都遇到过在使用MVVM一个视图模型关闭视图的一个聪明的办法?

也许有使用结合到信号的视图(窗口)以关闭的方法吗?

我真的很感激任何输入任何人有。

基本上,我有一个(使用命令绑定)我测试一下,看看如果登录成功,如果是我基本上加载了一个新的视图(MAINVIEW),并附上其的DataContext绑定到一个loginViewModel,在视图模型一个loginView。 ..

但我仍然有显示一个LoginView - 所以我需要,以表示它卸载..

我也希望有一个通用的解决方案,因为我敢肯定,我要去需要做这样的事情在其他情况下

有任何想法吗?

Answer 1:

编辑:请参见我的博客文章进行更详细的解释。

当我需要做到这一点,我用我创建了一个IRequestCloseViewModel接口。

该接口只包含一个事件:RequestClose。 此事件是由视图模型(这从ViewModelBase类继承并实现IRequestCloseViewModel)当它要关闭其相关视图提高。

在我的应用程序,所有窗口从一个抽象类继承ApplicationWindow。 每次在DataContext改变此抽象类通知,并在处理程序检查DataContext的支持IRequestCloseViewModel。 如果是这样的情况下,将事件处理程序设置当事件触发关闭该窗口。

另外,像肯特说,你可以使用屏幕控制器,在外部类处理这个mecanism。



Answer 2:

不知道你使用的是何种MVVM框架,但大多数都包含某种消息/通知解决方案,很容易有事情注册它们发送的邮件。 没有任何理由,我可以想像,你的看法无法为消息注册,如“CloseWindowsBoundTo”和视图模型作为发件人。 然后,在你看来,你可以注册该消息,以及当前的DataContext比较给发件人。 如果它们匹配,关闭该窗口。

简单,让您从您的视图模型抽象视图。

这里将使用MVVM光工具包,我的方法:

在视图模型:

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

并在视图:

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


Answer 3:

我知道这是一个老问题,但我有这样做的一个很好的办法,所以我想我会分享其他任何人碰到这个绊脚石。 我以前用的是dialogcloser附加的行为,但我发现下面的解决方案更容易在那里我可以使用它。 下面示例取窗口为简单起见在关闭按钮的一个例子。

通过窗口作为命令参数。

在按钮XAML为视图:

CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"

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

if (parameter is System.Windows.Window)
{
    (parameter as System.Windows.Window).Close();
}


Answer 4:

通常你会使用某种类型的控制器/主持人/服务来驱动屏幕激活/停用。 MVVM并不意味着是对统治他们一个模式 。 您需要将它与其他模式的任何不平凡的应用程序相结合。

这就是说,在某些情况下,在有意义的有一个管理子视图模型的生命周期视图模型。 例如,你可能有一个EditorViewModel管理子视图模型的集合-每个正在编辑的文档。 在这种情况下,简单地增加/从该集合中去除到/可导致视图激活/去激活。 但是,这听起来并不像它适合你的使用情况。



Answer 5:

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>



Answer 6:

你可以使附着在窗口和执行时关闭该窗口中的命令。 然后,你可以在命令绑定到您的视图模型的属性,当你想关闭该窗口执行命令。



Answer 7:

我会用它实例化LoginViewModel,并显示一个LoginView的ApplicationController中 。 当与登录屏幕的用户收益ApplicationController中关闭一个LoginView和示出了具有其MainViewModel所述的MainView。

如何可以做到这一点显示在样品应用WPF应用程序框架(WAF)项目。



Answer 8:

这个答案显示了另一种方式来做到这一点:

视图模型应该如何关闭该窗体?

它使用一个附加属性到的DialogResult窗口属性绑定到视图模型属性。 当设置的DialogResult的为真或假的值,该视图被关闭。



Answer 9:

只是接近的事件处理程序在后面的代码和处理一切都在视图模型,你可以使用命令绑定别的。



Answer 10:

你也可以做到这一点使用的事件。 虽然你需要像在后面视图代码3行代码(一些MVVM纯粹不喜欢这个);

在您的视图模型,您可以创建一个事件视图可以订阅:

    public event CloseEventHandler Closing;
    public delegate void CloseEventHandler();
    private void RaiseClose()
    {
        if (Closing != null)
            Closing();
    }

在你,查看您订阅下面的InitializeComponent方法后的事件:

        public View
        {
           *//The event can be put in an interface to avoid direct dependence of the view on the viewmodel. So below becomes
            //ICloseView model = (ICloseView)this.DataContext;*
            ProgressWindowViewModel model = (ProgressWindowViewModel)this.DataContext;
            model.Closing += Model_Closing;
        }
        private void Model_Closing()
        {
             this.Close();
        }

你只需简单地调用RaiseClose()当您准备好要关闭从视图模型视图。

你甚至可以使用这个方法来发送消息,从视图模型视图。

该事件可以放在一个接口,以避免对视图模型的视图的直接依赖性。



Answer 11:

若要从视图模型关闭视图我使用的Galasoft MVVM光工具包,你可以在这里下载: http://www.mvvmlight.net/

  1. 创建这样一个类:公共类ClosingRequested:MessageBase {}

  2. 此添加到视图的构造:Messenger.Default.Register(此,VM,味精=>关闭());

  3. 把这种关闭您的窗口:Messenger.Default.Send(新ClosingRequested(),这一点);



文章来源: WPF (MVVM): Closing a view from Viewmodel?