Arhn - архитектура программирования

Инициализировать пользовательскую коллекцию без массива в XAML

Я создаю настраиваемый элемент управления с набором отображаемых объектов. Я хотел бы, чтобы это была оболочка с некоторыми элементами и внутренним разделом, в котором размещались другие элементы, определяемые потребителем элемента управления. По сути, я хочу, чтобы он использовался аналогично StackPanel, где пользователь создает его и добавляет элементы управления в раздел содержимого. У меня это в основном работает с одной вещью, которую я не могу понять. Вот свойство зависимости «Страницы», которое необходимо установить:

    public static readonly DependencyProperty PagesProperty =
        DependencyProperty.Register("Pages", typeof(IEnumerable<MyContentPage>), typeof(UC_ApplicationWindow),
            new PropertyMetadata(new List<MyContentPage>()));

    public IList<MyContentPage> Pages
    {
        get => (IList<MyContentPage>)GetValue(PagesProperty);
        set => SetValue(PagesProperty, value);
    }

Это код из потребительского окна этого элемента управления, который в настоящее время работает:

        <graphicElements:UC_ApplicationWindow.Pages>
            <x:Array Type="graphicElements:MyContentPage">
                <graphicElements:MyContentPage>
                    <graphicElements:MyContentPage.Content>
                        ...the contents of the page
                    </graphicElements:MyContentPage.Content>
                </graphicElements:MyContentPage>
                <graphicElements:MyContentPage>
                    <graphicElements:MyContentPage.Content>
                        ...the contents of the page
                    </graphicElements:MyContentPage.Content>
                </graphicElements:MyContentPage>
            </x:Array>
        </graphicElements:UC_ApplicationWindow.Pages>

В идеале я хотел бы иметь возможность просто установить несколько элементов для свойства Pages, не предоставляя ему массив, однако, если я попытаюсь сделать это напрямую, я получаю сообщение об ошибке «Указанное значение не может быть назначено. Ожидался следующий тип: "IList'1".' Я также хотел бы иметь возможность указывать содержимое страницы напрямую, как это делают большинство других элементов управления WPF, но когда я вынимаю свойство прямого содержимого, оно говорит: «Тип« MyContentPage »не поддерживает прямое содержимое». Вот как я в конечном итоге хотел бы, чтобы это выглядело так:

        <graphicElements:UC_ApplicationWindow.Pages>
            <graphicElements:MyContentPage>
                ...the contents of the page
            </graphicElements:MyContentPage>
            <graphicElements:MyContentPage>
                ...the contents of the page
            </graphicElements:MyContentPage>
        </graphicElements:UC_ApplicationWindow.Pages>

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


Ответы:


1

Хорошо, благодаря этому сообщению я понял это. Все, что вам нужно сделать, это добавить атрибут «ContentProperty» вверху, и XAML будет анализировать это свойство как содержимое, если оно указано напрямую. Так что в этом случае я фактически сделал это дважды. Я поместил [ContentProperty(nameof(Pages))] в класс основного окна приложения и [ContentProperty(nameof(Content))] в класс MyContentPage.

Я также понял, спасибо за комментарий к этот пост Я понял, что если вы установите свойство Pages как IList вместо IEnumerable, вам не нужно указывать массив напрямую, он просто создает его. Теперь вместо этого:

<UC_ApplicationWindow>
    <graphicElements:UC_ApplicationWindow.Pages>
        <x:Array Type="graphicElements:MyContentPage">
            <graphicElements:MyContentPage>
                <graphicElements:MyContentPage.Content>
                    ...the contents of the page
                </graphicElements:MyContentPage.Content>
            </graphicElements:MyContentPage>
            <graphicElements:MyContentPage>
                <graphicElements:MyContentPage.Content>
                    ...the contents of the page
                </graphicElements:MyContentPage.Content>
            </graphicElements:MyContentPage>
        </x:Array>
    </graphicElements:UC_ApplicationWindow.Pages>
</UC_ApplicationWindow>

Я могу просто сделать это:

<UC_ApplicationWindow>
    <graphicElements:MyContentPage>
        ...the contents of the page
    </graphicElements:MyContentPage>
    <graphicElements:MyContentPage>
        ...the contents of the page
    </graphicElements:MyContentPage>
</UC_ApplicationWindow>

Аааа... гораздо чище :)

16.04.2018
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..