Создание логического дерева для пользовательского элемента управления

Я работаю над контролем, который имеет 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.

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