【问题标题】:WPF close window when property in ViewModel changes当 ViewModel 中的属性更改时 WPF 关闭窗口
【发布时间】:2011-06-09 17:52:11
【问题描述】:

我想知道是否有办法在视图模型中的属性更改时关闭窗口。在我的情况下,我有一个登录窗口,其中包含一个绑定到 LoginCommand 的 Ok 按钮,以便在单击 Ok 时执行 Login 函数。如果登录成功,我希望窗口关闭。

现在我知道我可以通过在我的按钮上添加一个事件处理程序来做到这一点,它调用如下函数:

private void Button_Click(object sender, RoutedEventArgs e)
{
  DatabaseCredentialsViewModel vm = (this.DataContext as DatabaseCredentialsViewModel);
  vm.Login();

  if (vm.LoginSuccessful)
  {
    this.Close();
  }
}

但我想知道是否有办法在 LoginSuccessful 属性更改时关闭窗口而我的按钮上没有事件处理程序(我喜欢只使用命令绑定而不是 Click 事件上的事件处理程序)。

谢谢

【问题讨论】:

    标签: wpf data-binding window


    【解决方案1】:

    Here's a similar question,满足了我的需求。

    基本上,您为窗口使用附加属性,该属性绑定到 VM 上的 bool? 属性。当 VM 属性设置为非空值时,附加属性设置窗口的DialogResult,这将自动关闭窗口。

    【讨论】:

    • 感谢您的回答!我将对此进行更多研究,因为我从来不需要添加附加属性,但如果它很简单,那可能是最好的解决方案。
    【解决方案2】:

    如果您愿意,可以尝试这种不同的方法。
    您可以通过将 OK 按钮与命令相关联来执行此操作。创建诸如 LoginSuccess 之类的事件,然后将 window.Close() 添加到事件回调列表中。然后你只需要引发 LoginSuccess 事件来关闭窗口。
    在我看来,这尊重 MVVM 模式定义的事件,该事件可用于其他触发器,而不仅仅是用于关闭窗口。

    【讨论】:

    • 是的,这可能就是我要走的路。我同意这是在不破坏 MVVM 模式的情况下最简单的方法。谢谢你:)
    【解决方案3】:

    您可以通过创建一个连接到您的窗口的attached propertyBehavior(来自 Blend SDK)来相当容易地做到这一点。

    我发布了一个sample behavior to the Expression Code Gallery,它做了类似的事情(尽管肯定不同)——它可以防止通过虚拟机上的属性关闭窗口。您可以非常轻松地调整代码(包含在下载中)以在属性更改时关闭窗口。

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多