我正在尝试使用here(第一个答案)描述的技术在TreeView项目上设置键绑定(bind)。因此,我在XAML中有一个TreeView,在TreeView项的ViewModel中定义了ICommand属性,还有一个助手类,该类注册了附加属性以支持TreeViewItem样式的键绑定(bind)。但是每次实际上只在我的TreeView的第一项上调用命令时,无论实际上选择了哪一项。为什么会这样,我该如何解决?还是有一些更好的方法可以在不破坏MVVM模式的情况下在TreeViewItems上设置键绑定(bind)?

XAML

<TreeView x:Name="tr" ItemsSource="{Binding Root}">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="local:AttachedTVIBinding.InputBindings">
                    <Setter.Value>
                        <InputBindingCollection>
                            <KeyBinding Key="A" Command="{Binding SomeCommand}"/>
                            <MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/>
                        </InputBindingCollection>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.ItemContainerStyle>
</TreeView>

TreeViewItem的ViewModel
public class ConfigurationNodeViewModel : INotifyPropertyChanged
{
        private DelegateCommand _someCommand;

        public DelegateCommand SomeCommand
        {
            get { return _editDesignCommand; }
        }
}

助手类(与提供的链接完全相同)
public class AttachedTVIBinding : Freezable
    {
        public static readonly DependencyProperty InputBindingsProperty =
            DependencyProperty.RegisterAttached("InputBindings", typeof(InputBindingCollection), typeof(AttachedTVIBinding),
            new FrameworkPropertyMetadata(new InputBindingCollection(),
            (sender, e) =>
            {
                var element = sender as UIElement;
                if (element == null) return;
                element.InputBindings.Clear();
                element.InputBindings.AddRange((InputBindingCollection)e.NewValue);
            }));

        public static InputBindingCollection GetInputBindings(UIElement element)
        {
            return (InputBindingCollection)element.GetValue(InputBindingsProperty);
        }

        public static void SetInputBindings(UIElement element, InputBindingCollection inputBindings)
        {
            element.SetValue(InputBindingsProperty, inputBindings);
        }

        protected override Freezable CreateInstanceCore()
        {

            return new AttachedTVIBinding();
        }

    }

最佳答案

这是迟到3年的答案,但可能对某人有用。

解决方案是使用一种样式,该样式通过设置x:Shared =“False”来应用包含您的KeyBinding和MouseBinding元素的非共享资源。这允许创建多个InputBindingCollection实例,因为WPF默认情况下仅创建样式的单个实例。

<InputBindingCollection x:Key="myBindings" x:Shared="False">
    <KeyBinding Key="A" Command="{Binding SomeCommand}"/>
    <MouseBinding Gesture="LeftDoubleClick" Command="{Binding SomeCommand}"/>
</InputBindingCollection>

<Style TargetType="{x:Type TreeViewItem}">
    <Setter Property="local:AttachedTVIBinding.InputBindings" Value="{DynamicResource myBindings}"/>
</Style>

请注意,x:Shared只能在已编译的ResourceDictionary中使用。
您也可以使用为TreeViewItem定义样式的同一ResourceDictionary,但必须将InputBindingCollection放在该样式之上。

关于c# - TreeViewItems和键绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7464360/

10-10 21:12