Wpf 在虚拟化模式为“的列表框中选择错误”;回收";和SeclectionMode=";“扩展”吗;?
我的行为真的很古怪。我在视图中有一个列表框,其中包含一个DataTemplate,用于包括ViewModels在内的项目。我将IsSelected绑定到我的ViewModel并使用SelectionMode=“Extended”。一切正常。 但是如果我添加virtualuationmode=“Recycling”选项,我会得到错误的项目。 复制:使用Ctrl键选择项目,然后向下滚动并仅选择一个项目。正常行为取消选择所有项目,只选择最后一个项目,而不按住Ctrl键。 但是如果我选中我的ViewModel,所有旧项目都会被选中Wpf 在虚拟化模式为“的列表框中选择错误”;回收";和SeclectionMode=";“扩展”吗;?,wpf,listbox,virtualization,recycle,Wpf,Listbox,Virtualization,Recycle,我的行为真的很古怪。我在视图中有一个列表框,其中包含一个DataTemplate,用于包括ViewModels在内的项目。我将IsSelected绑定到我的ViewModel并使用SelectionMode=“Extended”。一切正常。 但是如果我添加virtualuationmode=“Recycling”选项,我会得到错误的项目。 复制:使用Ctrl键选择项目,然后向下滚动并仅选择一个项目。正常行为取消选择所有项目,只选择最后一个项目,而不按住Ctrl键。 但是如果我选中我的ViewMo
<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>
有什么想法吗?我有一个解决办法,但为什么我必须在更改事件中“手动”更改它,而不是通过数据绑定
private void Lbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox lbx = (ListBox)sender;
foreach (PersonViewModel item in lbx.Items)
{
item.IsSelected = lbx.SelectedItems.Contains(item);
}
}
与KCT先前回答相关的另一个选项是使用
选择ChangedEventArgs
中的增补项和删除项
,并针对更改,例如:
private void Lbx_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var item in e.AddedItems)
{
((PersonViewModel)item).IsSelected = true;
}
foreach (var item in e.RemovedItems)
{
((PersonViewModel)item).IsSelected = false;
}
}
这可能会在更大的集合中提供更好的性能(我在列表框中的虚拟化互动程序面板中有大约15000个条目)。这是一个小错误,代码是:virtualizangstackpanel.VirtualizationMode=“Recycling”,但我仍然有问题。。。