Существует способ обойти это, не требуя отключения виртуализации (что снижает производительность). Проблема (как упоминалось в предыдущем ответе) заключается в том, что вы не можете полагаться на ItemContainerStyle для надежного обновления IsSelected
на всех ваших моделях просмотра, поскольку контейнеры элементов существуют только для видимых элементов. Однако вы можете получить полный набор выбранных элементов из свойства ListBox SelectedItems
.
Для этого требуется обмен данными с Viewmodel с представлением, что обычно является нарушением принципов MVVM. Но есть шаблон, который заставит все это работать и обеспечит возможность тестирования вашего модуля ViewModel. Создайте интерфейс представления для виртуальной машины, с которой можно общаться:
public interface IMainView
{
IList<MyItemViewModel> SelectedItems { get; }
}
В вашей модели представления добавьте свойство View:
public IMainView View { get; set; }
По вашему мнению, подпишитесь на OnDataContextChanged, затем запустите это:
this.viewModel = (MainViewModel)this.DataContext;
this.viewModel.View = this;
А также реализовать свойство SelectedItems:
public IList<MyItemViewModel> SelectedItems => this.myList.SelectedItems
.Cast<MyItemViewModel>()
.ToList();
Затем в вашей модели просмотра вы можете получить все выбранные элементы, набрав this.View.SelectedItems
.
Когда вы пишете модульные тесты, вы можете настроить IMainView на то, что вам нужно.