最初,我在加载的事件上添加了实际 treeviewitem 的输入绑定,如下所示:
void MultiSelectTreeViewItem_Loaded(object sender, RoutedEventArgs e)
{
this.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll, new KeyGesture(Key.A, ModifierKeys.Control)));
SignalViewModel svm = this.DataContext as SignalViewModel;
if (svm != null)
{
this.InputBindings.Add(new KeyBinding(DaedalusGraphViewer.GraphViewer.AddSignalsCommand, new KeyGesture(Key.Enter)));
}
BitViewModel bvm = this.DataContext as BitViewModel;
if (bvm != null)
{
this.InputBindings.Add(new KeyBinding(DaedalusGraphViewer.GraphViewer.OpenNewBusDialogCommand, new KeyGesture(Key.Enter)));
}
}
这样做的问题是,如果我想在其他地方使用 treeviewitem 并使用不同的命令,我每次都必须创建一个新的 treeviewitem 类。我在这里肯定违反了 MVVM 并且耦合太多,所以我想修复这个旧代码(最近一直在尝试采用 mvvm 实践,但仍然有很多我没有正确执行的旧东西)。
我想要的是一种在 xaml 中附加键绑定的方法,但是对于确定键绑定是否有效的因素,我仍然有些模糊。仅当键绑定所在的项目处于焦点时,键绑定才可用?您可以访问当前焦点项目的父键绑定或子键绑定吗?根据我的测试,您似乎无法从父级访问键绑定,而我阅读了另一篇 stackoverflow 帖子,看起来您似乎也无法访问子级。是这样吗?
我只需要一种很好的可定制方式来在可模板化的树视图的不同层上设置键绑定,这样我就不必每次都创建新类。
编辑:在我看来,一种可能的解决方案是将输入绑定附加到每一层的文本框,每个层都有不同的命令,然后拉伸文本框以填充项目并将焦点放在文本框而不是树视图上。那是最好的选择吗?理想情况下,我希望分层数据模板具有输入绑定或其他东西。