【问题标题】:Accessing controls from within commands in WPF从 WPF 中的命令中访问控件
【发布时间】:2011-02-27 06:23:10
【问题描述】:

我有一个 WPF 应用程序,它的菜单正在使用命令功能。一切都连接得很好,当我单击菜单中的按钮时,命令运行。但是,我无法让按钮的 IsEnabled 状态尊重我的命令的 CanExecute 部分。

一个挑战是命令需要查看您在 UI 中执行的操作。例如,只有在选择 ListBox 中的某些项目时,一个命令才可用,因此我需要获取对 ListBox 的引用......但由于该命令在我的视图模型(MVVM 模式)中公开,因此它没有访问 UI(顺便说一句,菜单在一个用户控件 [parent=mainwindow] 中,而 ListBox 在另一个用户控件 [parent=mainwindow] 中)。

此外,即使我对命令的 CanExecute 方法进行硬编码以返回 false,按钮的 Enabled 属性也不会改变……命令不会触发,但不会改变……令人沮丧。我假设我需要修改/引发 CanExecuteChanged 事件,但我不确定何时应该这样做(找不到好的示例)。

反馈?

【问题讨论】:

    标签: wpf command


    【解决方案1】:

    试试 MVVMLight 的 Messenger 课程。它有助于 ViewModel 之间的通信。

    试试这个:

    在 ListBox 的 ViewModel 中有一个 SelectedItem 属性。在属性更改时广播消息。在菜单的 ViewModel 中注册此消息。为您的逻辑使用 CanExecute 方法中的 SelectedItem 属性。

    【讨论】:

    • 检查了 MVVMLight...我喜欢 Messger 类的想法...谢谢!
    【解决方案2】:

    通常,您可以绑定 MenuItem/Button 的 Command 属性 - 这意味着您仍然可以使用 CommandParameter - 然后可以将其绑定到其他一些控件。但是,当两个视图彼此不认识时,您需要它们之间的某种中介(即两个视图都可以访问的视图模型 - 将列表框 SelectedItem/SelectedItems 双向绑定到属性 - 并让 CommandParameter单向绑定到同一个属性)。

    至于何时触发 CanExecuteChanged 事件 - 只要 CanExecute 方法中包含的逻辑发生更改,您就应该触发该事件。如果它始终为假,则永远不要触发该事件,因为它会在设置命令参数时读取初始值。 '

    如果您的按钮行为异常 - 检查 IsEnabled 属性是否受样式影响或直接设置。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2021-05-21
      • 2011-01-14
      相关资源
      最近更新 更多