在扩展选择模式下,似乎
演示: 项目
IsSelected
绑定存在问题。看起来只有最后一个选中的项目会被正确处理,而其他超出范围的项目则不会。演示: 项目
0
、1
、2
和 98
、97
、96
被使用 Control 选择。当选择 94
(不使用 Control!)时,选择计数器应该为 1
,但实际上看到的是 3
。向上滚动会发现,超出范围的最后一个选定项被取消了选择。
以下是 mcve:
xaml:
<ListBox ItemsSource="{Binding Items}" SelectionMode="Extended" SelectionChanged="ListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" />
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
cs:
public class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string property = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public class Item : NotifyPropertyChanged
{
bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set { _isSelected = value; }
}
public string Text { get; set; }
}
public class ViewModel : NotifyPropertyChanged
{
public ObservableCollection<Item> Items { get; }
public ViewModel()
{
var list = new List<Item>();
for (int i = 0; i < 100; i++)
list.Add(new Item() { Text = i.ToString() });
Items = new ObservableCollection<Item>(list);
}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Title = ((ViewModel)DataContext).Items.Count(item => item.IsSelected).ToString();
}
}
一个快速的解决方法是禁用列表控件(ListBox
或ListView
)的虚拟化:
VirtualizingStackPanel.IsVirtualizing="False"
问题:有什么办法可以在不禁用虚拟化的情况下解决它吗?
VirtualizingPanel.VirtualizationMode="Standard"
。 - XAMlMAXVirtualizingMode="Standard"
不会改善任何东西(已尝试使用VirtualizingPanel
和VirtualizingStackPanel
)。 - Sinatr