У меня есть 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 отправителя, и все работает нормально, однако я думаю, что привязка данных должна работать, и мне не придется делать это вручную. Будет ли привязка данных в этом случае асинхронной или мне нужно что-то делать явно?