WPF:绑定到ICommand的TreeViewItem

我正忙着在WPF中创建我的第一个MVVM应用程序。

基本上我遇到的问题是我有一个TreeView(System.Windows.Controls.TreeView),我放在我的WPF窗口,我已经决定将绑定到CommandViewModel项的ReadOnlyCollection,这些项目包括一个DisplayString,Tag和RelayCommand。

现在在XAML中,我有了TreeView,并且已成功将我的ReadOnlyCollection绑定到此。 我可以查看这个,UI中的一切看起来都很好。

现在的问题是我需要将RelayCommand绑定到TreeViewItem的Command,但是我可以看到TreeViewItem没有Command。 这是否迫使我在IsSelected属性中甚至在TreeView_SelectedItemChanged方法后面的代码中执行此操作,还是有办法在WPF中神奇地执行此操作?

这是我的代码:

     

理想情况下,我很乐意去:

      

有人有一个解决方案,允许我使用我有的RelayCommand基础设施。

谢谢你们,非常感谢!

理查德

我知道这是前一段时间“回答”了,但由于答案不理想,我想我会把我的两分钱。 我使用的方法允许我不必诉诸任何“样式按钮技巧”,甚至使用代码隐藏,而是保持我在MVVM中的所有分离。 在TreeView中添加以下xaml:

      

在你的xaml标题中添加:

 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

然后你必须在项目中添加对上面程序集的引用。

在那之后,一切行为都与任何其他命令相同,例如按钮或其他东西。

感谢您对该问题的投入,是的,我确实说过我不想要一个Code背后的解决方案,但当时我仍然非常感觉我只是遗漏了一些东西……所以我最终使用了TreeView_SelectedItemChanged事件。

尽管威尔的方法似乎是一个很好的解决方案,但就我个人而言,我决定使用背后的代码。 这样做的原因是,如果TreeViewItem具有可以绑定我的Command的“Command”属性,则View和XAML将保持不变。 现在我不必更改模板或视图,我所要做的就是为TreeView_SelectedItemChanged添加代码和事件。

我的解决方案

  private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) { if (sender != null) { var treeView = sender as TreeView; if (treeView != null) { var commandViewModel = treeView.SelectedItem as CommandViewModel; if (commandViewModel != null) { var mi = commandViewModel.Command.GetType().GetMethod("Execute"); mi.Invoke(commandViewModel.Command, new Object[] {null}); } } } } 

由于我已经将RelayCommand附加到TreeViewItem,我现在所做的只是在该特定的RelayCommand上手动调用“Execute”方法。

如果这是完全错误的方式,请告诉我…

谢谢!

我要做的是将TreeViewItem 的Header设置为一个按钮,然后为按钮设置外观,使其看起来不像一个按钮,然后对按钮执行命令绑定。

您可能需要通过DataTemplate执行此操作,或者您可能需要更改TreeViewItem本身的模板。 从来没有做过,但这就是我做类似事情的方式(比如标签页头)。


这是我正在谈论的一个例子(你可以放弃它在Kaxaml并玩它):

             

我为按钮创建了一个新的清晰风格。 然后我在TVI中放下一个按钮并设置其样式。 当然,您可以使用数据模板执行相同的操作。

这是一个很好的例子,说明MVVM在WPF中是如何经过深思熟虑的。 你希望有某些gui项目的Command支持,但是没有,所以你被迫通过一个精心设计的过程(如Will的例子所示)只是为了得到一个附加到某个东西的命令。

让我们希望他们在WPF 2.0中解决这个问题:-)