2

我花了很长时间寻找一个简单而直接的答案,但到目前为止失败了。我找到了对我有帮助的混合答案,但它们都会为非常非常简单的事情生成大量代码:

如何通过在 WPF 树视图中单击来获取所选项目?

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

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

4

1 回答 1

2

好吧,例如,如果您认为MouseDown是您的点击,您可以执行以下操作:

xml:

<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());
}

这样,只有在按下鼠标或按下 Enter 键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;
  }
}

xml:

<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 的索引

于 2013-05-06T13:46:26.353 回答