2011-07-29 133 views
3

我有以下UI项目 - 一个复选框列表和一个复选框与切换该列表中的所有复选框 -WPF复选框列表

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

有没有人看到我丢失的东西可能导致列表框不更新?

任何想法都可能会发生。

+0

'SomeEntity'实现'INotifyPropertyChanged',对吧? –

+0

@ H.B。 - 我打赌isChecked是一个领域,而不是一个财产。 – CodeNaked

+0

您必须显示SomeEntity的代码。 – CodeNaked

回答

4

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

就是这样 - 我刚在实体上有INotifyPropertyChanged,而不是实体内的属性。谢谢。 – czuroski