wpf复选框列表没有更新

时间:2011-07-29 13:11:11

标签: c# wpf xaml data-binding

我有以下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不会更新以反映所有项目都已选中/取消选中。

有没有人看到我遗漏的任何可能导致ListBox不更新的内容?

对任何想法都有所了解。

1 个答案:

答案 0 :(得分:7)

确保您的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));
    }
}