Создание логического дерева для пользовательского элемента управления
Я работаю над контролем, который имеет ObservableCollection
как один из его DependencyProperties
, Это свойство установлено как DefaultProperty
для моего контроля, поэтому я могу неявно добавлять элементы в коллекцию в XAML, создавая строки, подобные следующим:
<MyControl>
<MyItem/>
<MyItem/>
<MyItem/>
</MyControl>
Насколько я понимаю, движок WPF создает логическое дерево при разборе XAML. Поэтому каждый MyItem
должен быть логическим потомком MyControl
, И наоборот, MyControl
должен быть логическим родителем каждого MyItem
,
Ну, видимо, это еще не все. Ниже приведен код, который я использую для определения отношений выше. Пользовательский элемент управления содержит DependencyProperty
для ObservableCollection
и он поддерживается CLR-свойством.
[ContentProperty("Items")]
public class MyControl : Control
{
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
"Items",
typeof(ObservableCollection<MyItem>),
typeof(MyControl),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, OnItemsChangedProperty));
[Category("MyControl")]
public ObservableCollection<MyItem> Items
{
get { return (ObservableCollection<MyItem>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public MyControl() : base()
{ //Set a new collection per control, but don't destroy binding.
SetCurrentValue(ItemsProperty, new ObservableCollection<MyItem>());
}
}
Из с MyItem
(который наследует FrameworkContentElement
), Я пытаюсь получить доступ к его логическому родителю следующим образом:
if (Parent is FrameworkElement)
{ //Re-Render the parent control.
((FrameworkElement)Parent).InvalidateVisual();
}
К моему удивлению, родительский контроль никогда не перерисовывается. Это потому что MyItem.Parent
свойство равно нулю Почему это?
Как я могу дать команду движку WPF знать, что MyControl
должен быть логическим родителем MyItem
?
1 ответ
Если это для элемента управления диаграммы с несколькими графиками, вы определенно в ItemsControl
земельные участки. Возможно, вы захотите взглянуть на то, что вы можете построить из WPFToolkit
или один из других инструментов, перечисленных здесь:
/questions/43076369/elementyi-upravleniya-grafikom-wpf/43076380#43076380
Что касается вашего актуального вопроса, если вам действительно нужно добавить MyItem
с вашего логического дерева вручную, вам нужно вызвать AddLogicalChild()
например где-то в вашем OnItemsChangedProperty
событие. Есть пример на MSDN.