为了简化我遇到的问题,请考虑这个假设场景。
在我的控件的 XAML 中,我定义了一个TreeView
和两个固定根节点TreeViewItem
,“AItemsNode”和“BItemsNode”。在它的 ViewModel 中,我公开了两个子集合:AItems 和 BItems。然后,我将每个根节点的 ItemsSource 属性绑定到 ViewModel 上的相应集合。这很好用,并且完全显示了我想要的内容。
现在我想做的是为 ApplicationCommands.Open 添加一个 CommandBinding 到两个根节点的子TreeViewItem 节点。具体来说,我希望根“AItemsNode”下的子节点将其“Open”CommandBinding 指向“OpenAItem_Executed”,而第二个根节点的子节点将其指向“OpenBItem_Executed”。
我遇到的问题是我不知道如何在 TreeViewItem 对象本身上设置 CommandBindings。我根本无法通过 XAML 解决这个问题,如果我要在代码隐藏中执行此操作,我必须与 ItemContainerGenerator 集成,检查正在生成的内容并添加绑定,基本上我编写了这么多代码不妨将“打开”CommandBinding 添加到 TreeView 本身并检查 SelectedObject 并从那里开始。不是最优的,因为我现在有一个 Open_Executed 处理程序,它根据数据类型在所有地方委托,但它确实有效!
不过,我希望有人可以向我展示如何将 CommandBinding 直接添加到生成的 TreeViewItem 以避免这种情况并更干净地隔离代码。
那么......如何通过一种样式(或 XAML 中的任何其他方式)为 TreeViewItem 应用特定的 CommandBindings?