2017-07-01 138 views
0

我有一个ListBox和他的绑定有点问题。 除了当我调用函数LstExtensionUnSelectAll()时,所有的都很好,因为 没有任何变化,复选框再次被选中。WPF绑定对象

我认为这是一个愚蠢的事情,但我没有看到它。

<ListBox ItemsSource="{Binding LstExtension, Mode=TwoWay}" Grid.Row="0"> 
    <ListBox.ItemTemplate> 
     <HierarchicalDataTemplate> 
      <CheckBox Content="{Binding Extension}" IsChecked="{Binding Checked}"/> 
     </HierarchicalDataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

这是对象LstExtension:

public class CustomExtensions 
{ 
    public string Extension { get; set; } 
    public bool Checked { get; set; } 

    public CustomExtensions(string ext) 
    { 
     Extension = ext; 
     Checked = true; 
    } 
} 

private List<CustomExtensions> _LstExtension; 
public IEnumerable<CustomExtensions> LstExtension 
{ 
    get { return _LstExtension; } 
    set 
    { 
     if (value != _LstExtension) 
     { 
      _LstExtension = value.ToList(); 
      NotifyPropertyChanged("LstExtension"); 
     } 
    } 
} 

internal void LstExtensionUnSelectAll() 
{ 
    _LstExtension?.ForEach(c => c.Checked = false); 
    NotifyPropertyChanged("LstExtension"); 
} 
+0

为什么不添加'NotifyPropertyChanged(“Checked”);'在'Checked'属性中? – ASh

+0

请注意,在ItemsSource绑定上设置Mode = TwoWay是没有意义的。 – Clemens

回答

0

你需要更新你的CustomExtensions类使用INotifyPropertyChanged,使Checked引发事件每当值改变。

public class CustomExtensions : INotifyPropertyChanged 
{ 
    public string Extension { get; set; } 

    private bool _checked; 
    public bool Checked 
    { 
     get { return _checked; } 
     set 
     { 
      if (_checked == value) return; 
      _checked = value; 
      RaisePropertyChanged("Checked"); 
     } 
    } 

    public CustomExtensions(string ext) 
    { 
     Extension = ext; 
     Checked = true; 
    } 

    public virtual event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void RaisePropertyChanged(string name) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 
+0

非常感谢... – Gobelet