2010-06-03 78 views
1

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

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

此外,即使我硬编码命令的CanExecute方法返回false,该按钮的Enabled属性不会更改...该命令不会触发,但它不会更改...令人沮丧。我想我需要修改/提高CanExecuteChanged事件,但我不知道什么时候应该这样做(找不到一个好的示例)。

反馈?

回答

2

尝试从MVVMLight的信使类。它有助于ViewModels之间的通信。

这给一试:

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

+0

检出MVVMLight ...我喜欢Messger类的想法...谢谢! – 2010-06-15 15:43:35

2

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

至于何时触发CanExecuteChanged事件 - 只要CanExecute-method中包含的逻辑发生更改,就应该触发该事件。如果它始终为false,则不应该触发该事件,因为它将在设置Command参数时读取初始值。 '

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

希望这会有所帮助。