【问题标题】:Cancel command on button click单击按钮时取消命令
【发布时间】:2014-01-14 21:28:31
【问题描述】:

我目前有一个 Windows phone 8 应用程序,它有一个绑定到某个视图模型的用户控件。在视图模型中,我有一个绑定到视图上的按钮的命令属性。

我想在视图中弹出一个消息框,询问“您确定要执行 X 吗?”。如果是,它需要触发绑定到按钮的命令,否则它不需要触发命令。

我显然不想从视图模型中触发 MessageBox,因为这是视图逻辑。那么如何在视图中显示 MessageBox,然后不触发它绑定的命令。

编辑:让我说清楚。该命令位于视图模型中并绑定在 xaml 中。 MessageBox 显示在后面的视图代码中(在按钮的单击事件中)。我想保持这样。我的问题只是。一旦按下按钮并且消息框返回取消,我如何不触发命令。

【问题讨论】:

  • 可以在模型中显示MessageBox。并且消息框的结果可以通过事件返回给视图模型。
  • 对不起,我没有得到这个问题。请忽略我的回答(我会删除它)。
  • 为什么要在代码隐藏中显示消息框?如果您使用的是 MVVM,那么代码开始文件中应该没有任何内容。您应该将消息框的调用移动到模型中,并且在第一次单击时,如果用户选择“取消”,您可以将您的命令设置为空。
  • ViewModel 和 Model 不应该引用任何视图元素。 MessageBox 是一个视图元素,因此是视图的职责。您应该能够在没有视图的情况下对视图模型进行单元测试,并且混合责任也会阻碍这一点

标签: c# xaml windows-phone-8


【解决方案1】:

您可以在按钮的单击事件中执行此操作。您可以在单击事件处理程序中弹出消息框。如果用户想取消操作,只需设置 e.handle = true。

如果您不想使用代码隐藏,您可以创建自己的自定义按钮,您可以在其中覆盖按钮的 OnClick() 方法。在方法中显示消息框,如果用户想取消事件,请不要调用 base.OnClick();

您可以参考以下链接,作者解释了如何实现可取消的命令:

http://www.codeproject.com/Articles/274982/Commands-in-MVVM#hdiw1

【讨论】:

  • 普通按钮的事件参数RoutedEventArgs上没有e.handle。
  • @Murdock:嘿,这只是一个错字,您可以轻松解决。在 Button.Click 事件处理程序中,您会发现 e.Handled 可以设置为 true 以停止进一步传播事件。
【解决方案2】:

好的,我找到了解决方案。

我创建了一个新的 UserControl: ConfirmationButton,它具有依赖项 ICommand 属性,用于确认是否通过。在控件中,如果 MessagBox 返回是,我手动触发命令。然后,我在需要此类功能的地方使用这个新的 UserControl。

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 2011-11-24
    • 2017-11-24
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2012-01-15
    • 2012-01-21
    相关资源
    最近更新 更多