Привязка FrameworkElementFactory к свойству объекта данных - PullRequest
4 голосов
/ 20 февраля 2009

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

...