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