从WPF中的命令内访问控件

时间:2010-06-03 11:14:47

标签: wpf command

我有一个WPF应用程序,其菜单正在使用指挥功能。一切都很好,当我点击菜单中的按钮时,命令就会运行。但是我无法获得按钮的IsEnabled状态以尊重命令的CanExecute部分。

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

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

反馈

2 个答案:

答案 0 :(得分:2)

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

至于何时触发CanExecuteChanged事件 - 只要CanExecute方法中包含的逻辑发生变化,您就应该触发该事件。如果始终为false,则不应触发事件,因为在设置Command-parameter时它将读取初始值。 “

如果您的按钮表现奇怪 - 请检查IsEnabled属性是否受样式影响或直接设置。

希望这有帮助。

答案 1 :(得分:2)

尝试MVVMLight中的Messenger类。它有助于ViewModels之间的通信。

试一试:

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