wpf - 使用 VirtualizationMode ="Recycling"和 SeclectionMode ="Extended"在 ListBox 中选择错误?

标签 wpf listbox virtualization recycle

我有一个非常奇怪的行为。我在 View 中有一个 ListBox,它的项目包括 ViewModels 有一个 DataTemplate。我将 IsSelected 绑定(bind)到我的 ViewModel 并使用 SelectionMode="Extended"。一切正常。 但是,如果我添加 VirtualiuationMode="Recycling",我会得到错误的项目。 要重现:使用 Ctrl 选择项目,然后向下滚动并仅选择一个项目。正常行为会取消选择所有项目并只选择最后一个项目而无需按住 Ctrl。 但是如果我检查我的 ViewModel,所有旧项目都被选中了!?!

<Grid>
    <StackPanel>
        <ListBox ItemsSource="{Binding People}" MaxHeight="100"
                 SelectionMode="Extended"
                 VirtualizationMode="Recycling">
            <!--VirtualizingStackPanel.IsVirtualizing="True">-->

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

                </Style>

            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>

                    <views:PeopleView />

                </DataTemplate>

            </ListBox.ItemTemplate>
        </ListBox>
        <Button Click="Button_Click">
            OK
        </Button>
    </StackPanel>
</Grid>

项目模板

<UserControl x:Class="WpfApplication1.View.PeopleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="Auto" Width="Auto">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
        <ColumnDefinition Width="Auto" SharedSizeGroup="B"/>
    </Grid.ColumnDefinitions>
    <TextBox Text="{Binding Path=Name}" 
             Name="tbx_Name" 
           Grid.Column="0"/>

    <CheckBox IsChecked="{Binding Path=IstAktiv}"
        Name="cbx_IstAktiv" 
              Grid.Column="1"/>

</Grid>

有什么想法吗?

最佳答案

我有一个解决方法,但为什么我必须在更改事件中“手动”更改它而不是通过数据绑定(bind)?

    private void Lbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ListBox lbx = (ListBox)sender;
        foreach (PersonViewModel item in lbx.Items)
        {
            item.IsSelected = lbx.SelectedItems.Contains(item);
        }
    }

关于wpf - 使用 VirtualizationMode ="Recycling"和 SeclectionMode ="Extended"在 ListBox 中选择错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2929135/

相关文章:

angular - 如何将 cdk-virtual-scroll 与 ngx-infinite-scroll 一起使用

Ubuntu 无法在 FreeBSD/Bhyve 中安装

WPF TreeView : hide expand sign for all the leaf nodes

c#转换器获取指定的强制转换无效

c++ - 在 CListCtrl 中点击 Escape 与 Enter 触发 LVN_ENDLABELEDIT

regex - 让所有正则表达式匹配出现在列表框中,VB.NET

c# - 如何从列表框中的项目访问复选框

linux - Linux内核黑客攻击的虚拟环境

c# - 如何在 WPF 数据网格中一起选择所有复选框

wpf - 即使重叠对象为 IsHitTestVisible = false,底层对象的 MouseLeave 也会被触发