VirtualizingStackPanel + MVVM + множественный выбор

Почему остановка в объектах объекта? Если Вы не видите значение с объектами объекта в приложении уровня предприятия, то просто делают Ваш доступ к данным на чисто функциональном / процедурном языке и соединяют его проводом до UI. Почему не только отключает все OO "пух"?

26
задан Community 23 May 2017 в 12:25
поделиться

3 ответа

Я нашел другой способ обработки выделения в шаблоне 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;
    ...
}
33
ответ дан 28 November 2019 в 07:29
поделиться

Помимо того, что не используется VirtualizingStackPanel , единственное, что я могу придумать, - это захватить эти сочетания клавиш и иметь методы для изменения определенного диапазона вашей ViewModel , чтобы их свойство IsSelected было установлено на Истина (например, SelectAll () , SelectFromCurrentToEnd () ). В основном обход привязки в ListViewItem для управления выбором для таких случаев.

1
ответ дан 28 November 2019 в 07:29
поделиться

В моем случае я решил эту проблему, создав класс 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;
        }
    }
}
5
ответ дан 28 November 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: