2011-07-29 189 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