选择ListBox中的所有CheckBox未正确显示

时间:2015-02-20 15:06:33

标签: c# wpf checkbox listbox

如果我按下按钮"全部检查"应选择ListBox中的所有CheckBox并将其添加到存储所有已检查项目的列表中。问题是只有可见的复选框才能正确更新。

这是我的 C heck B ox L ist tem class:

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:

<Window x:Class="ListBoxBuggy.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:listBoxBuggy="clr-namespace:ListBoxBuggy"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}" WindowStartupLocation="CenterScreen">

    <Window.Resources>
        <DataTemplate x:Key="CheckBoxListItemTemplateNew" DataType="listBoxBuggy:Cbli">
            <CheckBox Name="CheckBox"
                      IsChecked="{Binding IsChecked}"
                      Checked="Update"
                      Unchecked="Update"
                      FontSize="14">
                <TextBlock Text="{Binding Name}" FontSize="14"/>
            </CheckBox>
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <ListBox HorizontalAlignment="Left" Height="300" VerticalAlignment="Top" Width="168"
                 ItemsSource="{Binding MyItemList}"
                 ItemTemplate="{StaticResource CheckBoxListItemTemplateNew}" 
                 />
        <ListBox HorizontalAlignment="Left" Height="290" Margin="297,10,0,0" VerticalAlignment="Top" Width="195"
                 ItemsSource="{Binding CheckedItems}"
                 />
        <Button Content="Check All" HorizontalAlignment="Left" Margin="173,10,0,0" VerticalAlignment="Top" Width="75" Click="Check_All"/>
        <Button Content="Uncheck All" HorizontalAlignment="Left" Margin="173,52,0,0" VerticalAlignment="Top" Width="75" Click="Uncheck_All"/>
    </Grid>
</Window>

背后的代码:

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;
        }
    }

向下滚动后,左侧列表中的所有20个项目都可见,然后点击&#34;全部检查&#34;按钮工作得很好,但我不知道为什么。

有人可以告诉我这个实施有什么问题吗?选中/取消选中一个CheckBox是可行的,但是检查/取消选中所有按钮都无法正常工作。

1 个答案:

答案 0 :(得分:1)

Blam的评论(设置VirtualizingStackPanel.VirtualizationMode="Standard"几乎就是解决方案。

添加VirtualizingStackPanel.IsVirtualizing="False"

<ListBox HorizontalAlignment="Left" Height="300" VerticalAlignment="Top" Width="168"
         ItemsSource="{Binding MyItemList}"
         ItemTemplate="{StaticResource CheckBoxListItemTemplateNew}"
         VirtualizingStackPanel.IsVirtualizing="False" />

这解决了问题(至少对我而言)