关闭命令WPF

时间:2011-06-01 19:06:35

标签: wpf events mvvm

我刚开始学习WPF。我目前有MenuItem文件 - >退出我的主窗口。

我想知道我应该如何向Exit MenuItem添加功能。我认为有3个主要选择

1)将事件处理程序添加到Exit menuitem的Click事件。然后在

后面的窗口代码中编写事件处理程序

2)向Exit菜单项添加一个Close命令,并在主窗口中添加一个处理命令的绑定。同样,这涉及到后面的窗口代码中添加代码。

3)向Exit MenuItem添加一个命令,该命令调用ViewModel中的方法。这会从后面的视图代码中删除代码,但意味着ViewModel需要保存对View的引用。

哪种方法最适合这种情况?

我不想直接将任何代码放入Views代码隐藏中。但是,由于这只是视图中的动作,因此方法1或2可能是最好的。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我遇到了完全相同的情况,这就是我所做的:

  • 由于我正在使用MVVMLight Toolkit,因此所有ViewModel都是在集中位置创建的,即ViewModelLocator。此类还包含静态属性,您可以通过它们访问这些视图模型。

  • 因此我在viewmodel中声明了一个事件,如下所示:

    public event EventHandler RequestClose;
    
  • 接下来,我在代码隐藏文件中为它提供了一个实现,我将从中打开viewmodel的关联视图,如下所示:

    var view = new NewView();
    view.Owner = this;
    ViewModelLocator.NewViewViewModelStatic.RequestClose += (s, e) => { view.Close(); };
    
  • 现在每当我需要从viewmodel关闭视图时,我只会打电话:

    RequestClose(this, new EventArgs());
    

希望它有所帮助。如果您有任何困惑,请告诉我。

答案 1 :(得分:1)

如何?不幸的是,没有明确的选择。

对于前两个选项,处理视图的关闭可以说是视图的范围,因此使用代码隐藏是可以接受的。您可以通过将 IsCancel 属性设置为true,使用按钮执行此操作。这会关闭窗口,如果你不必在 ViewModel 中处理关闭,那就完全没问了。

至于第三个选项,我通过将 CommandArgument 绑定到 Window 本身来完成此操作。 ICommand 执行方法中将 Window 作为参数。通过此 ICommand ,您可以在 ViewModel 中处理所需内容并关闭 Window

这是好还是坏?好吧,一些纯粹主义者可能认为这会依赖于 ViewModel ,这会破坏与其他视图类型的兼容性。实际上,我觉得很好。您可以做健美操以保持您的 ViewModel 绝对纯净,但代价是什么?

答案 2 :(得分:1)

如果它是一个基本的退出命令,我认为把它放在后面的代码中没有问题。

如果你开始想要在Exit期间执行其他代码,那么我将你的退出代码放在ViewModel的某个地方并绑定到它,或者使用类似MVVM Light的Messenger类或Prism的EventAggregator来提升CloseApplicationEvent,以便其他对象在关机期间自行处理。