最初我在加载的事件上添加了实际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帖子,看起来你似乎无法访问孩子。是这样的吗?
我只需要一个很好的可自定义方法来设置可以模板化的树视图的不同层上的键绑定,这样我就不必每次都创建新类。
编辑: 在我看来,一种可能的解决方案是将输入绑定附加到每个层的文本框,并为每个文本框添加不同的命令,然后拉伸文本框以填充项目并将焦点放在文本框而不是树视图上。那是最好的选择吗?理想情况下,我希望hierarchydatatemplate有输入绑定或其他东西。