如何通过仅在WPF中单击来获取选定的TreeViewItem?

时间:2013-05-06 12:14:03

标签: wpf mvvm treeview

我花了很长时间才找到一个简单直接的答案但到目前为止失败了。我找到了可以帮助我的混合答案,但是所有这些答案都会为真正非常简单的事情生成大量的代码:

如何通过WPF树状视图中的点击获取所选项目?

我已经知道如何获取所选项目或如何通过右键单击选择项目或如何通过键延迟项目选择(这里找到所有答案),但我只是想知道用户何时点击项目。这是必需的,因为我有一个treeView,用户可以使用箭头键导航(这将改变de IsSelected),但我只需要在单击项目或按下Return键时执行某些逻辑。

我喜欢纯粹的MVVM解决方案。如果那是不可能的,我在这里非常绝望,所以任何不可怕的东西都会有所帮助。

1 个答案:

答案 0 :(得分:2)

例如,如果您将MouseDown视为Click,则可以执行以下操作:

XAML:

<ListBox x:Name="testListBox">
  <ListBoxItem Content="A" />
  <ListBoxItem Content="B" />
  <ListBoxItem Content="C" />
</ListBox>

代码隐藏:

testListBox.AddHandler(MouseDownEvent, new MouseButtonEventHandler((sender, args) => ItemClicked()), true);
testListBox.AddHandler(
  KeyDownEvent,
  new KeyEventHandler(
    (sender, args) => {
      if (args.Key == Key.Enter)
        ItemClicked();
    }),
  true);

private void ItemClicked() {
  MessageBox.Show(testListBox.SelectedIndex.ToString());
}

使用此选项时,只有在MessageBox上按下鼠标或按下回车键时才会调用ListBoxItem。箭头键更改选择时不会。 SelectedIndex将在显示的MessageBox上保留正确的索引。

<强>更新

使用行为的MVVM方式:

public class ItemClickBehavior : Behavior<ListBox> {
  public static readonly DependencyProperty ClickedIndexProperty =
    DependencyProperty.Register(
      "ClickedIndex",
      typeof(int),
      typeof(ItemClickBehavior),
      new FrameworkPropertyMetadata(-1));

  public int ClickedIndex {
    get {
      return (int)GetValue(ClickedIndexProperty);
    }
    set {
      SetValue(ClickedIndexProperty, value);
    }
  }

  protected override void OnAttached() {
    AssociatedObject.AddHandler(
      UIElement.MouseDownEvent, new MouseButtonEventHandler((sender, args) => ItemClicked()), true);
    AssociatedObject.AddHandler(
      UIElement.KeyDownEvent,
      new KeyEventHandler(
        (sender, args) => {
          if (args.Key == Key.Enter)
            ItemClicked();
        }),
      true);
  }

  private void ItemClicked() {
    ClickedIndex = AssociatedObject.SelectedIndex;
  }
}

XAML:

<ListBox>
  <i:Interaction.Behaviors>
    <local:ItemClickBehavior ClickedIndex="{Binding VMClickedIndex, Mode=TwoWay}" />
  </i:Interaction.Behaviors>
  <ListBoxItem Content="A" />
  <ListBoxItem Content="B" />
  <ListBoxItem Content="C" />
</ListBox>

现在,属性VMClickedIndex将具有“Cicked”/“Enter Key Hit”的ListBox索引