WPF ListView でフォーカスされた項目をプログラムで設定する方法が見つかりません。選択したアイテムのバリエーションしか見つかりません | アイテム | インデックス | 値ですが、「フォーカスされた」アイテムは「選択された」アイテムに直接関連していません - フォーカスされたアイテムは選択されていない可能性があります (たとえば、Ctrl+クリックで現在のアイテムを選択解除する場合)。
手短に言えば、以下のコードから次の動作を取得したいと思います(ダミーのリストビューをダミーの8項目で埋め、Xを押すと最後から2番目の項目にフォーカスしようとします):
望まれる動作:
- マウスを使用 - 2 番目の項目を選択
- X を押す - これは最後から 2 番目のアイテムにフォーカスします
- キーボードの「Down」配列を押します-これにより、現在の選択が最後の項目に移動します
実際に何が起こるか:
- マウスを使用 - 2 番目の項目を選択
- X を押す - これにより、最後から 2 番目のアイテムが選択されますが、フォーカスは最初から 2 番目のアイテムに残ります
- キーボードの「Down」配列を押します。これにより、現在の選択が最後の項目に移動するはずですが、代わりに 3 番目の項目が選択されます。
注: プレーンな Win32 API (もちろん、これは WPF とはまったく異なるものです) には、このための LVM_SETSELECTIONMARK メッセージがあります。WPF でアナログが見つかりませんでした。それは存在しますか?
サンプル XAML:
<Window x:Class="WpfListviewTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<ListView x:Name="List1" KeyDown="List1_KeyDown">
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Column 1" />
<GridViewColumn Width="140" Header="Column 2" />
<GridViewColumn Width="140" Header="Column 3" />
</GridView>
</ListView.View>
<sys:DateTime>1/2/3</sys:DateTime>
<sys:DateTime>4/5/6</sys:DateTime>
<sys:DateTime>7/8/9</sys:DateTime>
<sys:DateTime>10/11/12</sys:DateTime>
<sys:DateTime>1/2/3</sys:DateTime>
<sys:DateTime>4/5/6</sys:DateTime>
<sys:DateTime>7/8/9</sys:DateTime>
<sys:DateTime>10/11/12</sys:DateTime>
</ListView>
</Window>
サンプル コード ビハインド:
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void List1_KeyDown(object sender, KeyEventArgs e) {
if( e.Key == Key.X ) {
List1.SelectionMode = SelectionMode.Single;
List1.SelectedIndex = List1.Items.Count - 2;
}
}
}