WPF复选框列表未更新

本文关键字:更新 列表 复选框 WPF | 更新日期: 2023-09-27 18:04:01

我有以下ui项-一个复选框列表和一个复选框,用于切换该列表中的所有复选框-

<DockPanel>
    <CheckBox
        Name="SelectCheckboxes"
        Command="{Binding ToggleCheckBoxes}"
        Content="Whatever"/>
</DockPanel>
<DockPanel>
    <ListBox Name="MyListBox"
             ItemsSource="{Binding Path=MyProperty, Mode=TwoWay}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Name="MyCheckBox"
                          Content="{Binding myvalue}"
                          Tag="{Binding mycode}"
                          IsChecked="{Binding Path=isChecked, Mode=TwoWay}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</DockPanel>

这里是MyProperty属性

public ObservableCollection<SomeEntity> MyProperty
{
    get { return _someEntities; }
    set
    {
        if (value == _someEntities)
            return;
        _someEntities = value;
        base.OnPropertyChanged("MyProperty");
    }
}

这里是ToggleCheckBoxes命令-

public ICommand ToggleCheckBoxes
{
    get
    {
        if (_toggleCheckBoxesCommand == null)
        {
            _toggleCheckBoxesCommand = new RelayCommand(
                param => this.toggleCheckBoxes()
                );
        }
        return _toggleCheckBoxesCommand;
    }
}
void toggleCheckBoxes()
{
    foreach (var i in MyProperty)
    {
        if (i.isChecked)
            i.isChecked = false;
        else
            i.isChecked = true;
    }
}

当我单击复选框来切换复选框时,我可以查看代码中的属性并看到isChecked属性被更改,但是ListBox没有更新以反映所有项都被选中/未选中。

有没有人看到我遗漏的任何可能导致列表框不更新的东西?

谢谢你的建议。

WPF复选框列表未更新

确保您的isChecked成员实际上是一个属性,并且SomeEntity实现了INotifyPropertyChanged。比如:

public class SomeEntity : INotifyPropertyChanged {
    private bool _isChecked;
    public bool isChecked
    {
        get { return _isChecked; }
        set
        {
            if (value == _isChecked)
                return;
            _isChecked= value;
            this.NotifyPropertyChanged("isChecked");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}