Listbox SelectionChanged срабатывает по ошибке при изменении макета окна
У меня есть ListBox в окне с некоторыми другими компонентами. Когда я изменяю видимость этих других компонентов, ListBox запускает событие SelectionChanged с новым selectedIndex = 0. Это очень нежелательно. (Этого не произойдет, если вы вставите точки останова или, предположительно, Sleep).
Я хочу надежное событие, которое срабатывает только тогда, когда пользователь фактически меняет выбор ListBox, а не когда WPF просто меняет компоновку окна. Существует ли такая вещь, или для чего-то более надежного я должен просто создать свой собственный элемент управления с нуля, используя кнопки?
1 ответ
для чего-то более надежного
Если вы хотите надежное приложение, вам нужен надежный дизайн.
Если вы работаете с WPF, вам нужно отказаться от традиционного подхода, основанного на событиях, и понять и принять менталитет WPF.
Я хочу знать, когда пользователь использует мышь или клавиатуру, чтобы изменить выбор списка
Вместо того, чтобы обрабатывать события, оставлять кучу кода позади и надеяться, что сложности Visual Tree позволят этому работать, просто используйте правильную привязку данных:
<ListBox ItemsSource="{Binding SomeCollection}"
SelectedItem="{Binding SelectedItem}"/>
правильной ViewModel:
public class MyViewModel
{
public ObservableCollection<MyClass> SomeCollection {get;set;}
public MyClass SelectedItem {get;set;} //Don't forget INotifyPropertyChanged
}
- Посмотрите, как я не обрабатываю какие-либо события и не оставляю код позади. Дерево Visual может делать все, что захочет, и генерировать как можно больше событий, и мой код все равно будет работать.
- Также посмотрите, как этот подход намного чище, потому что он позволяет действительно разделить пользовательский интерфейс и данные.
- Я мог бы говорить о преимуществах настоящего MVVM навсегда, но сейчас я слишком ленив. Дайте мне знать, если вам нужна дополнительная помощь.