任何人都遇到过在使用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/
创建这样一个类:公共类ClosingRequested:MessageBase {}
此添加到视图的构造:Messenger.Default.Register(此,VM,味精=>关闭());
把这种关闭您的窗口:Messenger.Default.Send(新ClosingRequested(),这一点);
文章来源: WPF (MVVM): Closing a view from Viewmodel?