Почему остановка в объектах объекта? Если Вы не видите значение с объектами объекта в приложении уровня предприятия, то просто делают Ваш доступ к данным на чисто функциональном / процедурном языке и соединяют его проводом до UI. Почему не только отключает все OO "пух"?
Я нашел другой способ обработки выделения в шаблоне MVVM, который решил мою проблему. Вместо сохранения выбора в модели просмотра выбор извлекается из ListView / ListBox и передается в качестве параметра команде. Все сделано в XAML:
<ListView
x:Name="_items"
ItemsSource="{Binding Items}" ... />
<Button
Content="Remove Selected"
Command="{Binding RemoveSelectedItemsCommand}"
CommandParameter="{Binding ElementName=_items, Path=SelectedItems}"/>
в моей ViewModel:
private void RemoveSelection(object parameter)
{
IList selection = (IList)parameter;
...
}
Помимо того, что не используется VirtualizingStackPanel
, единственное, что я могу придумать, - это захватить эти сочетания клавиш и иметь методы для изменения определенного диапазона вашей ViewModel
, чтобы их свойство IsSelected
было установлено на Истина
(например, SelectAll ()
, SelectFromCurrentToEnd ()
). В основном обход привязки
в ListViewItem
для управления выбором для таких случаев.
В моем случае я решил эту проблему, создав класс ListBoxEx из ListBox и добавив код для ответа на изменения выбора, принудительно устанавливая состояние выбора в моделях представления элементов:
private readonly List<IListItemViewModelBase> selectedItems = new List<IListItemViewModelBase>();
protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{
base.OnSelectionChanged(e);
bool isVirtualizing = VirtualizingStackPanel.GetIsVirtualizing(this);
bool isMultiSelect = (SelectionMode != SelectionMode.Single);
if (isVirtualizing && isMultiSelect)
{
var newSelectedItems = SelectedItems.Cast<IListItemViewModelBase>();
foreach (var deselectedItem in this.selectedItems.Except(newSelectedItems))
{
deselectedItem.IsSelected = false;
}
this.selectedItems.Clear();
this.selectedItems.AddRange(newSelectedItems);
foreach (var newlySelectedItem in this.selectedItems)
{
newlySelectedItem.IsSelected = true;
}
}
}