我有一个 ListBox ,其 DataTemplate 是使用3个FrameworkElementFactory对象在代码中创建的(A StackPanel ,附加2个子项( CheckBox) 和 TextBox ))。集合中与 ListBox 的 ItemsSource 绑定的item对象基本上与您通常使用任何类型的 ListControl看到的Item对象类型相同即可。我要做的是将 DataTemplate 中的 CheckBox 的 IsChecked 属性绑定到Item对象的布尔属性。 ListBox 支持3种模式,单选,多选和多检。我试图实现的模式是多重检查,以便 CheckBox 的 IsChecked 属性绑定到item对象的 Selected 属性。这会创建一种行为,当 ListBoxItem 上的 CheckBox 的 IsChecked 属性为true时,该项仅被视为已选中,而不是在WPF < strong> ListBoxItem 的IsSelected属性为true。应该发生的是数据对象上的boolean属性应该绑定到IsChecked属性,并且当更改IsChecked属性时,item对象上的 Selected 属性将更新,因此将更新<幕后的strong> SelectedItems 集合。
以下是我刚才描述的一些简化代码。
ListBox innerListBox = new ListBox();
//The ItemsSource of the ListBox being set to the collection of items
this.innerListBox.ItemsSource = this.Manager.ItemManagers;
this.innerListBox.ItemTemplate = this.GetMultipleCheckTemplate();
public System.Windows.DataTemplate GetMultipleCheckTemplate()
{
DataTemplate dt = new DataTemplate;
FrameworkElementFactory factorySP = new FrameworkElementFactory(typeof(StackPanel));
FrameworkElementFactory factoryCB = new FrameworkElementFactory(typeof(CheckBox));
factoryCB.SetBinding(CheckBox.IsCheckedProperty, new Binding("Selected");
RoutedEventHandler clickHandler = new RoutedEventHandler(ItemCheckBox_Click);
factoryCheckBox.AddHandler(CheckBox.ClickEvent, clickHandler, true);
factorySP.AppendChild(factoryCB);
FrameworkElementFactory factoryTB = new FrameworkElementFactory(typeof(TextBlock));
factoryTB .SetBinding(TextBlock.TextProperty, new Binding("Description");
factorySP.AppendChild(factoryTB);
template.VisualTree = factorySP;
return template;
}
有些代码我不包括 CheckBox 上的事件处理程序。如果Wpf ListBox 上有多个选择,则该范围内的所有CheckBox都将切换为单击的CheckBox的值。我可以手动将Item上的Selected属性设置为发送方的IsChecked属性,一切正常,但我认为数据绑定应该正常工作,我不必手动执行此操作。在这种情况下,数据绑定是不同步的还是我需要明确地做某事?