Привязка FrameworkElementFactory к свойству объекта данных

У меня есть ListBox, DataTemplate которого создается в коде с использованием 3 объектов FrameworkElementFactory (StackPanel с 2 дочерними объектами (CheckBox и TextBox)). Объект item в коллекции, который связан с ItemsSource объекта ListBox, в основном представляет собой тот же тип объекта Item, который вы обычно видите с любым типом ListControl. Я пытаюсь связать свойство IsChecked CheckBox в DataTemplate с логическим свойством объекта Item. ListBox поддерживает 3 режима: одиночный выбор, множественный выбор и многократный контроль. Режим, который я пытаюсь реализовать, является мульти-проверкой, так что свойство IsChecked CheckBox связано со свойством Selected объекта item. Это создает поведение, при котором элемент считается выбранным, только когда свойство IsChecked CheckBox в ListBoxItem имеет значение true, а не когда свойство IsSelected WPF ListBoxItem имеет значение true. Что должно произойти, так это то, что логическое свойство объекта данных должно быть связано со свойством IsChecked, а когда свойство IsChecked изменяется, свойство Selected объекта item будет обновляться и, таким образом, обновлять коллекцию 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, по которому щелкнули. Я могу вручную установить для свойства Selected элемента Item свойство IsChecked отправителя, и все работает нормально, однако я думаю, что привязка данных должна работать, и мне не придется делать это вручную. Будет ли привязка данных в этом случае асинхронной или мне нужно что-то делать явно?

0 ответов

Другие вопросы по тегам