gpt4 book ai didi

c# - 扩展选择模式、虚拟化和 IsSelected 绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 20:26:59 24 4
gpt4 key购买 nike

似乎处于扩展选择模式IsSelected绑定(bind)是错误的。看起来只有选择中的最后一项超出范围得到了正确处理。

演示:

项目 0 , 1 , 298 , 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();
}
}

快速修复是禁用列表控件(ListBoxListView)虚拟化:

VirtualizingStackPanel.IsVirtualizing="False"

问题:知道如何在不禁用虚拟化的情况下修复它吗?

最佳答案

嗯,这是预期的行为。虚拟化仅为可见项创建可视容器 (ListBoxItem)。为了使绑定(bind)起作用,容器必须首先存在,因此只有可见的项目会受到影响。

有两个明显的解决方案:

  1. 禁用虚拟化。
  2. 改为使用 SelectionChanged 事件。您可以从 SelectionChangedEventArgs 获取添加和删除的项目。然后您需要做的就是执行强制转换并相应地设置 IsSelected 属性(您不需要遍历 Items)。 Ctrl+A 也可以,您只需要处理添加的项目(并完全删除绑定(bind)):

    void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    foreach (var removedItem in e.RemovedItems.Cast<Item>())
    {
    removedItem.IsSelected = false;
    }
    foreach (var addedItem in e.AddedItems.Cast<Item>())
    {
    addedItem.IsSelected = true;
    }
    Title = ((ViewModel) DataContext).Items.Count(item => item.IsSelected).ToString();
    }

关于c# - 扩展选择模式、虚拟化和 IsSelected 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com