WPF элемент, который динамически создает (инкапсулированные) дети во время выполнения

StackOverflow https://stackoverflow.com/questions/3101868

Вопрос

Я хочу создать элемент WPF, который, во время выполнения, полностью контролирует его дочерние элементы - добавляя и удаление UI ребенка при изменении его свойств. Что-то немного похоже на то, что делает элементы контроль, когда вы измените свой собственность предметов, хотя в моем случае будет только один ребенок.

Это будет просмотр контейнера для MVVM - при этом модели или ViewModel, она волшебно создаст правильный просмотр и проводит все. Там нет необходимости в контейнере моего просмотра, чтобы быть Templatable (поскольку он создает пользовательские представления, которые являются USERCONTROLS и имеют свои собственные шаблоны), и я предпочел бы, чтобы оно было максимально возможной инкаптуре. Я, вероятно, мог бы сделать это легко, спускаясь от чего-то вроде сетки, и добавляя детские элементы управления, когда мои собственные свойства меняются; Но Grid публично обнародует свою коллекцию дочерних элементов и позволяет кому-либо добавлять и удалять вещи.

Какой класс WPF я должен скинуться от максимальной инкапсуляции, и как я добавляю дочерних элементов к нему во время выполнения?

Исходя из моего понимания документов, я попытался использовать FrameworkElement и AddVisualChild, просто чтобы увидеть, смогу ли я создать элементы управления дочерним элементом во время выполнения. Я не ясно, нужен ли addLogicalChild, но я положил его на случай:

public class ViewContainer : FrameworkElement {
    private TextBlock _child;

    public ViewContainer() {
        _child = new TextBlock { Text = "ViewContainer" };
        AddLogicalChild(_child);
        AddVisualChild(_child);
        InvalidateMeasure();
    }

    public object Content { get; set; }

    protected override Size ArrangeOverride(Size finalSize) {
        _child.Arrange(new Rect(finalSize));
        return finalSize;
    }
    protected override Size MeasureOverride(Size availableSize) {
        _child.Measure(availableSize);
        return _child.DesiredSize;
    }
}

Когда я положил ViewContainer в окно, и запустите это, я ожидаю увидеть текстовыйБлок, говорящий «ViewContainer». Но вместо этого я просто вижу пустое окно. Так очевидно, я что-то упускаю.

Как я могу исправить вышеуказанный код, чтобы элемент управления «дочерним» отображается во время выполнения, но не подвержены другим, чтобы беспокоить (все больше, чем можно избежать)?

Это было полезно?

Решение

Чтобы ответить на ваш конкретный вопрос, вам также нужно переопределить GetVisualChild. и VisualChildrencount. Свойства, позволяющие отображать элемент вашего дочернего элемента.

Другие советы

Вы думали об использовании поддержки WPF для неявных данных DataTemplates?

То, как я обработал требование, подобное вашему, является использованием ContentControl. Отказ Я связываю Content Имущество моему ViewModel. Затем я убедитесь, что в словарях ресурсов, упомянутые где-то в дереве выше ContentControl, у меня есть DataTemplates, определенные для всех типов просмотра, которые могут быть присвоены свойству содержимого.

Таким образом, WPF позаботится о проводке правильного представления для моего ViewModel.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top