C# 选择列表框中的所有复选框未正确显示

C# 选择列表框中的所有复选框未正确显示,c#,wpf,checkbox,listbox,C#,Wpf,Checkbox,Listbox,如果我按下“全选”按钮,列表框中的所有复选框都将被选中并添加到存储所有选中项的列表中。问题是只有可见的复选框被正确更新 这是我的CheckBoxListItem课程: public class Cbli : INotifyPropertyChanged { private string _name; private Boolean _isChecked; public string Name { get { return _name; }

如果我按下“全选”按钮,列表框中的所有复选框都将被选中并添加到存储所有选中项的列表中。问题是只有可见的复选框被正确更新

这是我的CheckBoxListItem课程:

public class Cbli : INotifyPropertyChanged
{
    private string _name;
    private Boolean _isChecked;

    public string Name
    {
        get { return _name; }
        set { _name = value; OnPropertyChanged("Name"); }
    }

    public bool IsChecked
    {
        get { return _isChecked; }
        set { _isChecked = value; OnPropertyChanged("IsChecked"); }
    }

    public override string ToString()
    {
        return string.Format("Name: {0}, IsChecked: {1}", _name, _isChecked);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
XAML:


以及背后的代码:

public partial class MainWindow : Window
    {
        public ObservableCollection<Cbli> MyItemList { get; set; }
        public ObservableCollection<Cbli> CheckedItems { get; set; }

        public MainWindow()
        {
            // add dummy data
            MyItemList = new ObservableCollection<Cbli>();
            CheckedItems = new ObservableCollection<Cbli>();
            for (int i = 0; i < 20; i++)
            {
                Cbli cbli = new Cbli
                {
                    Name = "Test " + i,
                    IsChecked = i < 5 || i > 15
                };
                MyItemList.Add(cbli);

                if (cbli.IsChecked)
                    CheckedItems.Add(cbli);
            }

            InitializeComponent();
        }

        private void Update(object sender, RoutedEventArgs e)
        {
            CheckBox selectedCheckbox = (CheckBox)sender;
            Cbli cbli = (Cbli)selectedCheckbox.DataContext;

            if (cbli.IsChecked)
                CheckedItems.Add(cbli);
            else
                CheckedItems.Remove(cbli);
        }

        private void Check_All(object sender, RoutedEventArgs e)
        {
            foreach (Cbli cbli in MyItemList)
                cbli.IsChecked = true;
        }

        private void Uncheck_All(object sender, RoutedEventArgs e)
        {
            foreach (Cbli cbli in MyItemList)
                cbli.IsChecked = false;
        }
    }
公共部分类主窗口:窗口
{
公共ObservableCollection MyItemList{get;set;}
公共可观测集合CheckedItems{get;set;}
公共主窗口()
{
//添加虚拟数据
MyItemList=新的ObservableCollection();
CheckedItems=新的ObservableCollection();
对于(int i=0;i<20;i++)
{
Cbli Cbli=新的Cbli
{
Name=“Test”+i,
IsChecked=i<5 | | i>15
};
MyItemList.Add(cbli);
如果(cbli.IsChecked)
CheckedItems.Add(cbli);
}
初始化组件();
}
私有无效更新(对象发送者,路由目标)
{
选中复选框复选框=(复选框)发件人;
Cbli Cbli=(Cbli)selectedCheckbox.DataContext;
如果(cbli.IsChecked)
CheckedItems.Add(cbli);
其他的
CheckedItems.Remove(cbli);
}
私有无效检查\u All(对象发送方、路由目标方)
{
foreach(我的项目列表中的Cbli Cbli)
cbli.IsChecked=true;
}
private void取消选中所有(对象发送方、RoutedEventArgs e)
{
foreach(我的项目列表中的Cbli Cbli)
cbli.IsChecked=false;
}
}
向下滚动后,左侧列表上的所有20个项目都可见,然后单击“全部检查”按钮工作得很好,但我不知道为什么

有人能告诉我这个实现有什么问题吗?选中/取消选中单个复选框可以正常工作,但选中/取消选中所有按钮都不能正常工作。

来自BARM的评论(设置
VirtualizationStackPanel.VirtualizationMode=“Standard”
几乎就是解决方案

添加虚拟化StackPanel.isVirtualization=“False”:



这解决了问题(至少对我来说)

+1关于这个问题。我可以重复这个问题,我也搜索了一个解决方案,但没有成功。在这种特殊情况下,最简单的解决方案可能是只需在Check_All,Uncheck_All中处理CheckedItems的添加和删除,但问题的根本原因仍然未知。In显示了类似的问题。哇,谢谢!我们的工作非常顺利我从来没有听说过(甚至没有使用过)那处房产。
public partial class MainWindow : Window
    {
        public ObservableCollection<Cbli> MyItemList { get; set; }
        public ObservableCollection<Cbli> CheckedItems { get; set; }

        public MainWindow()
        {
            // add dummy data
            MyItemList = new ObservableCollection<Cbli>();
            CheckedItems = new ObservableCollection<Cbli>();
            for (int i = 0; i < 20; i++)
            {
                Cbli cbli = new Cbli
                {
                    Name = "Test " + i,
                    IsChecked = i < 5 || i > 15
                };
                MyItemList.Add(cbli);

                if (cbli.IsChecked)
                    CheckedItems.Add(cbli);
            }

            InitializeComponent();
        }

        private void Update(object sender, RoutedEventArgs e)
        {
            CheckBox selectedCheckbox = (CheckBox)sender;
            Cbli cbli = (Cbli)selectedCheckbox.DataContext;

            if (cbli.IsChecked)
                CheckedItems.Add(cbli);
            else
                CheckedItems.Remove(cbli);
        }

        private void Check_All(object sender, RoutedEventArgs e)
        {
            foreach (Cbli cbli in MyItemList)
                cbli.IsChecked = true;
        }

        private void Uncheck_All(object sender, RoutedEventArgs e)
        {
            foreach (Cbli cbli in MyItemList)
                cbli.IsChecked = false;
        }
    }
<ListBox HorizontalAlignment="Left" Height="300" VerticalAlignment="Top" Width="168"
         ItemsSource="{Binding MyItemList}"
         ItemTemplate="{StaticResource CheckBoxListItemTemplateNew}"
         VirtualizingStackPanel.IsVirtualizing="False" />