Нет, нет, нет людей !! Никакого изменения размера, никаких пользовательских элементов управления или, что еще хуже, подклассов! Просто создайте стиль для ListBoxItem, который устанавливает его свойство Visibility в «Collapsed», а его свойство «IsEnabled» - в «false», когда IsSelected объекта ListBoxItem имеет значение false, а сам ListBox не имеет фокуса. (Лучший способ сделать это с помощью MultiTrigger.) Наконец, установите в списке значение auto-size для его содержимого. Готово и сделано! И это тоже чистый XAML!
Мы используем эту технику для быстрой «фильтрации» списков и даже TreeViews достаточно эффективно, за исключением того, что мы связываем видимость со свойством IsFiltered в нашей ViewModel.
Лучшая часть, так как вы не привязываетесь к коллекции ObservableCollection, из которой вы постоянно добавляете и удаляете вещи, все свойства, которые доступны только для просмотра (например, IsExpanded), точно такие же, как вы оставили их при показе элементов Опять же, все без необходимости отслеживать их в ViewModel! Это чисто пользовательский интерфейс. Все «Просмотр».
Я уже говорил, что это чистый XAML ??? Ох ... я сделал. Просто убедитесь, что вы знаете, что это чистый XAML !!!
И снова ... сделайте уверенным , чтобы установить для 'IsEnabled' значение false, когда вы скрываете ListBoxItem (используйте триггер или привязку, чтобы сделать это для вас), иначе навигация с помощью клавиатуры не будет работать!