我有一个ListBox,其DataTemplate是使用 3 个 FrameworkElementFactory 对象(带有 2 个附加子项(CheckBox和TextBox)的StackPanel )在代码中创建的。集合中绑定到ListBox的ItemsSource的item 对象与您通常在任何类型的ListControl中看到的 Item 对象类型基本相同。我要做的是将DataTemplate中CheckBox的IsChecked属性绑定到 Item 对象上的布尔属性。列表框支持 3 种模式,单选、多选和多选。我试图实现的模式是多重检查,以便CheckBox的IsChecked属性绑定到项目对象的Selected属性。这会创建一种行为,其中仅当ListBoxItem上的CheckBox的IsChecked属性为真时才认为该项目被选中,而不是当 WPF ListBoxItem的 IsSelected 属性为真时。应该发生的是数据对象上的布尔属性应该绑定到 IsChecked 属性,并且当 IsChecked 属性更改时,项目对象上的Selected属性将更新,从而更新一个幕后的 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 属性,一切正常,但是我认为数据绑定应该可以正常工作,我不必手动执行此操作。在这种情况下,数据绑定是异步的还是我需要明确地做一些事情?