wpf で ListBox コントロールのカスタム動作を実装する必要があります。アイデアは、最後に選択した要素の選択解除を無効にすることです。ユーザーが選択したアイテムをマウスでクリックしたときのデフォルトの動作によると、ctrl キーを押したままにすると、選択が消えます。ユーザーが最後に選択した項目で mouse+ctrl をクリックしたときにリストボックスが何もしないようにするロジックを実装する必要があります。
私が見つけた唯一のアプローチは、ListBox.SelectionChanged にサブスクライブして、次のようなことを行うことです。
private static void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var listBox = sender as ListBox;
if (listBox != null && e.RemovedItems != null && e.RemovedItems.Count == 1)
{
var removed = e.RemovedItems[0];
if (listBox.SelectedItems.Count == 0)
{
if (listBox.SelectionMode == System.Windows.Controls.SelectionMode.Single)
{
listBox.SelectedItem = removed;
}
else
{
listBox.SelectedItems.Add(removed);
}
e.Handled = true;
}
}
}
この場合、 ListBox.SelectedItem が viewmodel プロパティにバインドされているときに望ましくない呼び出しが発生するため、このソリューションは私には適していません。
疑似コールスタック (選択項目の選択を解除する場合):
SelectedItem が null に変更されました
listBox_SelectionChanged が呼び出されます
SelectedItem は前の値に設定されます
私が望むのは、ステップ 1 と 3 が起こらないことだけです。SelectedItem が変更されると、実行時間の長い非同期操作が開始されるため、これは重要です。
ありがとう、アドバイスをいただければ幸いです!