4

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

4

0 回答 0