我刚开始学习WPF。我目前有MenuItem文件 - >退出我的主窗口。
我想知道我应该如何向Exit MenuItem添加功能。我认为有3个主要选择
1)将事件处理程序添加到Exit menuitem的Click事件。然后在
后面的窗口代码中编写事件处理程序2)向Exit菜单项添加一个Close命令,并在主窗口中添加一个处理命令的绑定。同样,这涉及到后面的窗口代码中添加代码。
3)向Exit MenuItem添加一个命令,该命令调用ViewModel中的方法。这会从后面的视图代码中删除代码,但意味着ViewModel需要保存对View的引用。
哪种方法最适合这种情况?
我不想直接将任何代码放入Views代码隐藏中。但是,由于这只是视图中的动作,因此方法1或2可能是最好的。有什么想法吗?
答案 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
,以便其他对象在关机期间自行处理。