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