2012-03-03 62 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は、私がイベントCBOText文字列が正しく設定されて、PropertyChangedを発射取得を参照してくださいすることができます

<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> 

... ...それを証明することはかなり小さいダミーのプロジェクトを持っていますが、それが最初の項目でない限り、コンボボックスはそれを反映しません。かなり奇妙な、任意のアイデア?

答えて

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> 
関連する問題