2

シンプルでストレートな答えを探すのに長い時間を費やしましたが、これまでのところ失敗しました。私に役立つさまざまな回答を見つけましたが、それらのすべてが、本当に、本当に単純なものに対して膨大な量のコードを生成します。

WPFツリービューでクリックして選択したアイテムを取得するにはどうすればよいですか?

選択したアイテムを取得する方法、右ボタン クリックでアイテムを選択する方法、またはキーでアイテムの選択を遅らせる方法 (すべての回答がここにあります) は既に知っていますが、ユーザーがいつアイテムをクリックしたかを知りたいだけです。ユーザーが矢印キーでナビゲートできるツリービューがあるため(IsSelectedが変更されます)、これが必要ですが、アイテムがクリックされたとき、またはReturnキーが押されたときにロジックを実行するだけです。

純粋な MVVM ソリューションが欲しいです。それが不可能な場合、私はここで非常に絶望的であるため、怪物的でないものは何でも役立ちます.

4

1 に答える 1

2

たとえばMouseDown、クリックとして考えると、次のようなことができます。

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

これにより、マウスが上で押されたとき、または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;
  }
}

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 のインデックスが含まれます。

于 2013-05-06T13:46:26.353 に答える