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)
我知道这是一个老问题,但我有一个很好的方法,所以我想我会分享给其他任何绊倒这个的人.我曾经使用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)
通常,您会使用某种控制器/演示者/服务来驱动屏幕激活/停用.MVVM并不是一种统治它们的模式.您需要在任何非平凡的应用程序中将其与其他模式结合使用.
也就是说,在某些情况下,有一个视图模型可以管理子视图模型的生命周期.例如,您可能拥有一个EditorViewModel管理子视图模型集合的集合 - 每个模型对应一个正在编辑的文档.在这种情况下,只需在此集合中添加/删除可以导致视图激活/停用.但这听起来并不适合您的用例.
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>