2012-03-03 161 views
1

我正在尝试使复选框显示复选框,并选中每个复选框将更新组合框的文本以显示所有已检查的内容。出于某种奇怪的原因,它仅适用于复选框中的第一项,它完全让我感到困惑,原因何在。我有一个虚拟项目,是非常小的演示它...组合框与复选框

public partial class MainWindow : Window 
{ 
    public ObservableCollection<DataObject> Collection { get; set; } 
    #region Private Methods 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Collection = new ObservableCollection<DataObject>(); 
     Collection.Add(new DataObject { Name = "item1" }); 
     Collection.Add(new DataObject { Name = "item2" }); 
     Collection.Add(new DataObject { Name = "item3" }); 
     Collection.Add(new DataObject { Name = "item4" }); 
     Collection.Add(new DataObject { Name = "item5" }); 
     this.DataContext = Collection; 
    } 
    #endregion 

    private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     CheckBox chk = sender as CheckBox; 
     DataObject data = chk.DataContext as DataObject; 
     if ((bool)chk.IsChecked) 
      data.CboItems.Add(data.Name); 
     else if (data.CboItems.Contains(data.Name)) 
      data.CboItems.Remove(data.Name); 

    } 

} 

public class DataObject : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 
    public string Name { get; set; } 
    private string cbotext; 
    public string CBOText { 
     get 
     { 
      return cbotext; 
     } 
     set 
     { 
      cbotext = value; 
      FirePropertyChanged("CBOText"); 
     } 
    } 
    public ObservableCollection<string> CboItems { get; set; } 

    private void FirePropertyChanged(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 

    public DataObject() 
    { 
     CboItems = new ObservableCollection<string>(); 
     CboItems.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(CboItems_CollectionChanged); 
    } 

    void CboItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     string text = string.Empty; 
     foreach (string item in CboItems) 
     { 
      if (text == string.Empty) 
       text = item; 
      else 
       text += ", " + item; 
     } 
     CBOText = text; 
    } 
} 

和XAML中...

<ComboBox Text="{Binding CBOText}" Width="150" Height="30" ItemsSource="{Binding}" x:Name="cbo" HorizontalContentAlignment="Stretch" IsEditable="True" Margin="12,12,342,270"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate>  
       <CheckBox Content="{Binding Name}" Checked="CheckBox_Checked" Unchecked="CheckBox_Checked" /> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 

我可以看到事件CBOText字符串得到正确设置和射击的PropertyChanged,但除非它是第一个项目,否则组合框不会反映它。很奇怪,有什么想法?

回答

1

您的绑定安装不正确。尝试是这样的:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public ObservableCollection<DataObject> Collection { get; set; } 
    public event PropertyChangedEventHandler PropertyChanged; 

    #region Private Methods 
    public MainWindow() 
    { 

     InitializeComponent(); 
     Collection = new ObservableCollection<DataObject>(); 
     Collection.Add(new DataObject { Name = "item1" }); 
     Collection.Add(new DataObject { Name = "item2" }); 
     Collection.Add(new DataObject { Name = "item3" }); 
     Collection.Add(new DataObject { Name = "item4" }); 
     Collection.Add(new DataObject { Name = "item5" }); 
     this.DataContext = this; 
    } 
    #endregion 

    private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     CheckBox chk = sender as CheckBox; 
     DataObject data = chk.DataContext as DataObject; 
     string combinedText = string.Empty; 
     foreach (var item in this.Collection) 
     { 
      if (item.IsChecked.HasValue && item.IsChecked.Value) 
      { 
       if (combinedText == string.Empty) 
        combinedText = item.Name; 
       else 
        combinedText += ", " + item.Name; 
      } 
     } 
     CboText = combinedText; 
    } 

    private string _cboCombinedText = "" ; 
    public string CboText 
    { 
     get 
     { 
      return this._cboCombinedText; } 
     set 
     { 
      this._cboCombinedText = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("CboText")); 
     } 
    } 

    public class DataObject 
    { 
     private bool? _isChecked = false; 
     public string Name { get; set; } 
     public bool? IsChecked { get { return _isChecked; } set { _isChecked = value; } } 
    } 
} 

和XAML:

 <ComboBox Text="{Binding CboText}" Width="150" Height="30" ItemsSource="{Binding Path=Collection}" x:Name="cbo" HorizontalContentAlignment="Stretch" IsEditable="True" Margin="12,12,342,270"> 
     <ComboBox.ItemTemplate > 
      <DataTemplate > 
       <CheckBox Content="{Binding Name}" Checked="CheckBox_Checked" Unchecked="CheckBox_Checked" IsChecked="{Binding IsChecked}" /> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox>