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 навсегда, но сейчас я слишком ленив. Дайте мне знать, если вам нужна дополнительная помощь.
Другие вопросы по тегам