Решение включает в себя 3 события и одну переменную состояния типа bool:
private bool inhibitAutoCheck;
private void listView1_MouseDown(object sender, MouseEventArgs e) {
inhibitAutoCheck = true;
}
private void listView1_MouseUp(object sender, MouseEventArgs e) {
inhibitAutoCheck = false;
}
private void listView1_ItemCheck(object sender, ItemCheckEventArgs e) {
if (inhibitAutoCheck)
e.NewValue = e.CurrentValue;
}
Проверка элемента позволяет избежать перехода в другое состояние проверки (вызывается до события ItemChecked). Решение простое и уверенное.
Чтобы выяснить это, я провел небольшой тест с различными событиями:
При нажатии:
- MouseDown <------------- запрещенная область </li>
- Нажмите
- MouseClick
- MouseUp ------------->
- ItemCheck ( за пределами запрещенная область)
- ItemChecked
При двойном нажатии:
- MouseDown <------------- запрещенная область </li>
- ItemSelectionChanged
- SelectedIndexChanged
- Нажмите
- MouseClick
- MouseUp ------------->
- MouseDown <------------- запрещенная область </li>
- ItemCheck ( внутри запрещенная область)
- ItemActivate
- DoubleClick
- MouseDoubleClick
- MouseUp ------------->