wpf - VirtualizingStackPanel + MVVM + 多选

标签 wpf listview mvvm stackpanel virtualizingstackpanel

我已经实现了一种类似于 this post 中描述的选择模式使用 ViewModel 存储 IsSelected 值,并通过将 ListViewItem.IsSelected 绑定(bind)到 ViewModel IsSelected:

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
    </Style>
</ListView.ItemContainerStyle>

一般都能用,但我遇到了一个严重的问题。通过使用 VirtualizingStackPanel 作为 ListView 中的面板,只会创建可见的 ListViewItem。如果我使用“Ctrl+A”选择所有项目,或者在第一个项目上使用快捷键组合(如“Shift+Ctrl+End”),所有项目都会被选中,但对于不可见项目,ViewModel 不会获得其 IsSelected设置为真。这是合乎逻辑的,因为如果未创建 ListViewItem,绑定(bind)将无法工作。

有没有人遇到同样的问题,并找到了解决方案(除了不使用 VirtualizingStackPanel)?

最佳答案

我在 MVVM 模式中找到了另一种处理选择的方法,它解决了我的问题。不是在 View 模型中维护选择,而是从 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;
    ...
}

关于wpf - VirtualizingStackPanel + MVVM + 多选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7429931/

相关文章:

wpf - ContextMenu 绑定(bind)到 ObservableCollection<MenuItem> 不刷新数据

c# - WPF TabControl 如何在鼠标向上而不是鼠标向下时更改 Tab?

wpf - WPF中的Measure中的NullReferenceException

C++ winapi ListView NM_CUSTOMDRAW : not getting CDDS_ITEMPREPAINT

android - 从 Arraylist<HashMap<String, String>> 填充 ListView

c# - WPF DataGrid 动态列绑定(bind)

c# - 如何在文本框上显示气球提示?

wpf - 选择行时设置WPF DataGrid行的文本颜色

android - Android Listview-具有YouTube链接的可点击项?

MVVM ViewModel 暴露同一集合的多个 View