VirtualizingStackPanel + MVVM + multiple selection

后端 未结 3 752
太阳男子
太阳男子 2020-11-28 05:13

I have implemented a selection pattern similar to the one described in this post using a ViewModel to store the IsSelected value, and by binding the ListViewItem.IsSel

3条回答
  •  执念已碎
    2020-11-28 05:43

    In my case, I ended up solving this by deriving a ListBoxEx class from ListBox, and adding code to respond to selection changes, enforcing the selection state on the item view models:

    private readonly List selectedItems = new List();
    
    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();
    
            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;
            }
        }
    }
    

提交回复
热议问题