关闭WPF MVVM中的窗口

时间:2014-08-27 21:28:05

标签: c# wpf linq mvvm

我一直在与WPF和MVVM合作一段时间。在我的项目的一部分中,我使用以下代码关闭窗口。但代码有效,我还不了解代码背后的逻辑。我的代码是:

App.Current.Windows.Cast<Window>()
    .Where(win => win is DisplayView).FirstOrDefault()
    .Close();

为什么需要FirstOrDefault()?

2 个答案:

答案 0 :(得分:3)

它只使用一些Linq IEnumerable<T>扩展来从集合中获取与给定类型匹配的第一个项目,然后在该实例上调用Close。它实际上是不必要的冗长,因为:

App.Current.Windows.Cast<Window>()
    .Where(win => win is DisplayView)

或多或少等同于:

App.Current.Windows.OfType<DisplayView>()

此外,调用FirstOrDefault()后跟“关闭”有点傻。 FirstOrDefault类似于First,除非它返回null而不是在没有元素的情况下抛出异常 - 但在这种情况下它会抛出异常,因为你在null对象上调用“Close”。


所以我会这样写:

App.Current.Windows.OfType<DisplayView>().First().Close();

如果你想确认实际上有一个DisplayView实例,并防止在这种情况下发生异常,那么你可以使用它:

var displayViews = App.Current.Windows.OfType<DisplayView>();
if (displayViews.Any())
    displayViews.First().Close();

答案 1 :(得分:0)

让我们把它分开:

  • App.Current:获取正在运行的WPF应用程序(我认为应该是Application.Current
  • .Windows.Cast<Window>():获取窗口列表,但因为这是一个无类型集合,所以强力键入以使用所有 LINQ 运算符
  • .Where(win => win is DisplayView):LINQ运算符用于过滤窗口列表,仅保留DisplayView类型的
  • .FirstOrDefault():获取此集合的第一个元素,如果没有,则获取null
  • .Close():关闭我们获得的窗口,这很危险,因为如果没有找到NullReferenceException,它会被打击

这是一种更安全的方法:

DisplayView view = App.Current.Windows.Cast<Window>()
                                      .Where(win => win is DisplayView)
                                      .FirstOrDefault();

if (view != null)
{
    view.Close();
}