Архитектура модели редактирования

Реализация времени разработки взаимодействует с элементами управления среды выполнения с помощью программного интерфейса, называемого моделью редактирования. Разрабатываемые объекты называются редактируемыми объектами. В этом разделе описана архитектура и использование модели редактирования в Конструктор WPF для Visual Studio.

Элементы управления определяются в коде XAML. Обновление кода XAML для элементов управления программными средствами выполняется с помощью модели редактирования.

Модель, оболочка и представление

Модель редактирования состоит из трех функциональных единиц: модели, открытой оболочки, абстрагирующей модель, и представления пользовательского интерфейса модели. Модель и представление разделены, но оболочка и модель тесно связаны. На следующем рисунке показана взаимосвязь между тремя модулями.

Отношения между Model, ModelItem и View

В среде разработки используется тип ModelItem для взаимодействия с базовой моделью. Все изменения вносятся в оболочки ModelItem, влияющие на базовую модель. Это делает модель проще. Оболочки ModelItem обрабатывают сложные функциональные возможности конструкторов, такие как поддержка транзакций, отслеживание отмены и уведомления об изменении.

Создание экземпляров

Любая функция конструктора, для которой требуется создание новых объектов на поверхности разработки, использует класс ModelFactory. Каждый объект в конструкторе заключается в экземпляр оболочки ModelItem. Элементы модели создаются классом ModelFactory.

В следующем коде демонстрируется обычный вызов класса ModelFactory.

ModelItem newButton = ModelFactory.CreateItem(_context, typeof(Button));

Метод CreateItem всегда возвращает тип данных ModelItem. Это базовый тип для всех элементов в модели редактирования сред. Конструктор WPF, и он представляет заключенный в оболочку экземпляр типа, переданного методу CreateItem. Для метода CreateItem также требуется экземпляр контекста редактирования сред. Конструктор WPF (_context в предыдущем примере кода), который используется для поиска других служб и зависимостей в конструкторе.

Подробное создание элемента при помощи класса "factory" важно для объектов, которые будут помещены на рабочую область конструирования, где по умолчанию есть инициализаторы. Эта процедура необязательна, когда выполняется лишь назначение значений для свойств.

Всегда используйте для создания новых объектов на рабочей области конструирования метод CreateItem. Это необходимо потому, что многие необработанные экземпляры не могут быть преобразованы в элементы моделей. Если значение в модели установлено, взаимодействие с ним возможно только через модель. Экземпляр, являющийся резервной копией модели, может быть перестроен с помощью платформы .NET Framework в любое время, что делает любые кэшированные ссылки недействительными.

Параметры создания

Иногда необходимо настроить поведение создания объектов. Например, компонент подключения к базе данных может отказаться от запроса к базе данных во время разработки. Может потребоваться контролировать создание экземпляра при первом создании компонента.

В этом случае компонент перетаскивается с панели элементов или вставляется из буфера обмена. Возможно, потребуется предварительно настроить компонент с требуемыми значениями по умолчанию. Если эти значения по умолчанию не изменяются, они сериализуются в код XAML.

Можно передать необязательный набор флагов в метод CreateItem с помощью перечисления CreateOptions.

Флаг InitializeDefaults используется такими средствами, как средство создания, для инициализации набора заранее установленных значений свойств. Например, свойство ContentControl может предоставлять некоторое содержимое по умолчанию. Это не заменяет правильно указанных значений по умолчанию свойств в коде элемента управления среды выполнения.

Наборы значений с этим флагом сохраняются в коде XAML.

Этот флаг не следует использовать в синтаксически анализируемом коде, так как значения по умолчанию мог быть удалены пользователем в процессе редактирования объекта в конструкторе.

Метод CreateItem направляет вызов методу CreateItem. Этот метод выполняет несколько этапов, описанных в следующей блок-схеме.

Явное создание экземпляра с использованием создания API

Изменение родительского элемента на новый контейнер

Помимо создания новых элементов, существует другая общая задача конструктора: изменение родительского элемента на другой. Это изменение обрабатывается через статический класс с именем ModelParent, что обеспечивает функциональные возможности, требуемые для большинства родительских связей.

  • Поиск допустимого родительского объекта с заданными координатами смещения или начальным элементом в иерархии для поиска.

  • Определение, может ли данный объект быть родительским элементом определенного типа.

  • Изменение родительского элемента объекта на другой родительский элемент. Это изменение также удаляет старый родительский элемент из объекта. Это удаление позволяет старому родительскому элементу очистить все данные, например вложенные свойства, которые могут располагаться в элементе.

Класс ModelParent осуществляет поиск класса ParentAdapter для текущего и предлагаемого родительских объектов. Если класс ParentAdapter не существует, объект не может быть назначен родительским элементом. Класс ParentAdapter определяет несколько перегрузок для общих случаев. Например, многие перегрузки принимают объект GestureData в качестве параметра. Этот тип данных доступен из механизма команд сред. Конструктор WPF при обработке кодом пользовательской команды. Он предоставляет общие контекстные сведения.

Класс ParentAdapter позволяет контейнерам выполнять корректное удаление родительского элемента. Например, если объект с родительским элементом управления Canvas изменяется на родительский элемент управления Grid, вложенные свойства элемента управления Canvas в объекте могут быть удалены автоматически.

См. также

Ссылки

EditingContext

Microsoft.Windows.Design.Services

GestureData

Другие ресурсы

Расширяемость среды конструктора WPF