다음을 통해 공유


모델 아키텍처 편집

업데이트: 2007년 11월

디자인 타임 구현은 편집 모델이라는 프로그래밍 인터페이스를 통해 런타임 컨트롤과 상호 작용합니다. 디자인하고 있는 개체를 편집 가능한 개체라고 합니다. 이 항목에서는 Windows Presentation Foundation(WPF) Designer for Visual Studio 편집 모델의 아키텍처와 사용법에 대해 설명합니다.

여기서 컨트롤은 XAML(eXtensible Application Markup Language)로 정의합니다. 그리고 컨트롤의 XAML을 편집 모델을 사용하여 프로그래밍 방식으로 업데이트합니다.

모델, 래퍼 및 뷰

편집 모델은 모델, 모델을 추상화하는 공용 래퍼 및 모델의 UI(사용자 인터페이스)를 나타내는 뷰라는 세 가지 하위 기능 단위로 구성됩니다. 모델과 뷰는 별개이지만 래퍼와 모델은 밀접한 관련이 있습니다. 다음 그림에서는 세 가지 하위 단위 사이의 관계를 보여 줍니다.

Model, ModelItem 및 View 관계

디자인 환경에서는 ModelItem 형식을 사용하여 내부 모델과 통신합니다. 모든 변경 내용은 내부 모델에 영향을 주는 ModelItem 래퍼에 적용됩니다. 이를 통해 모델이 단순화됩니다. ModelItem 래퍼는 트랜잭션 지원, 실행 취소 추적, 변경 알림 등의 복잡한 디자이너 기능을 처리합니다.

인스턴스 만들기

디자인 화면에서 새 개체를 만들어야 하는 모든 디자인 기능에서는 ModelFactory 클래스를 사용합니다. 디자이너의 각 개체는 ModelItem 인스턴스로 래핑되어 있습니다. 모델 항목은 ModelFactory를 사용하여 만들어집니다.

다음 코드에서는 일반적인 ModelFactory 호출을 보여 줍니다.

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

CreateItem 메서드는 항상 ModelItem의 데이터 형식을 반환합니다. 이것은 WPF Designer 편집 모델에서 모든 항목의 기본 형식이며 CreateItem 메서드에 전달된 형식의 래핑된 인스턴스를 나타냅니다. CreateItem 메서드에는 WPF Designer 편집 컨텍스트(이전 코드 예제의 _context )의 인스턴스도 필요합니다. 이 인스턴스는 디자이너에서 다른 서비스 및 종속성을 찾는 데 사용됩니다.

팩터리를 통한 명시적 항목 만들기는 기본 이니셜라이저를 가질 수 있는 디자인 화면에 개체를 배치할 경우에만 중요합니다. 속성을 값에 설정하기만 하는 경우에는 이 절차가 필요하지 않습니다.

만들기 옵션

경우에 따라 개체의 만들기 동작을 사용자 지정해야 합니다. 예를 들어 데이터베이스 연결 구성 요소에서 디자인 타임에 데이터베이스를 쿼리하지 않도록 할 수 있습니다. 구성 요소를 처음으로 만들 때 인스턴스 만들기를 제어할 수도 있습니다.

이 경우 구성 요소를 도구 상자에서 끌어 오거나 클립보드에서 붙여넣습니다. 적절한 기본값을 사용하여 구성 요소를 미리 구성할 수도 있습니다. 이러한 기본값은 변경되지 않는 경우 XAML로 serialize됩니다.

CreateOptions 열거형을 사용하여 선택적 플래그 집합을 CreateItem 메서드에 전달할 수 있습니다. 다음 표에서는 이러한 열거형의 값과 사용법을 보여 줍니다.

InitializeDefaults 플래그는 만들기 도구와 같은 도구에서 미리 구성된 속성 값 집합을 초기화하는 데 사용됩니다. 예를 들어 ContentControl은 일부 기본 콘텐츠를 제공할 수 있습니다. 이것을 런타임 컨트롤 코드에서 올바로 지정하는 속성의 기본값 대신 사용할 수 없습니다.

이 플래그로 설정한 값은 XAML로 유지됩니다.

사용자가 디자이너에서 개체를 편집하는 동안 기본값을 제거했을 수 있으므로 구문 분석 코드에서 이 플래그를 사용해서는 안 됩니다.

CreateItem 메서드는 CreateItem에 대한 호출을 라우팅합니다. 이 메서드에서는 다음 순서도에서 간략히 설명하는 여러 단계를 수행합니다.

생성 API를 사용한 명시적 인스턴스 생성

항목의 부모를 새 컨테이너로 변경

새 항목을 만드는 것과 더불어 또 하나의 일반적인 디자이너 작업은 한 항목의 부모를 변경하는 것입니다. 이러한 작업은 대부분의 부모 지정 요구 사항에 공통되는 기능을 제공하는 ModelParent라는 정적 클래스를 통해 처리합니다.

  • 검색할 계층 구조의 좌표 오프셋이나 시작 값을 지정하여 유효한 부모 개체 찾기

  • 지정한 객체가 특정 형식의 부모가 될 수 있는지 여부 확인

  • 한 개체의 부모를 다른 부모로 변경. 부모를 변경하면 개체의 이전 부모가 제거됩니다. 이러한 제거를 통해 이전 부모에서 항목에 있을 수 있는 연결된 속성과 같은 데이터를 정리할 수 있습니다.

ModelParent 클래스는 현재 부모 개체와 제안된 부모 개체의 ParentAdapter 클래스를 찾아야만 작동합니다. ParentAdapter 클래스가 없으면 개체를 부모에 할당할 수 없습니다. ParentAdapter 클래스는 일반적인 경우에 대한 여러 재정의를 정의합니다. 예를 들어 대부분의 재정의에서는 GestureData 개체를 매개 변수로 사용합니다. 이 데이터 형식은 코드에서 사용자 명령을 처리할 때 WPF Designer 명령 메커니즘에서 사용할 수 있으며 일반적인 컨텍스트 정보를 제공합니다.

ParentAdapter를 사용하면 컨테이너에서 스마트 부모 제거를 수행할 수 있습니다. 예를 들어 Canvas 컨트롤 부모를 갖는 개체가 Grid 컨트롤 부모로 변경되는 경우 개체에서 Canvas 컨트롤의 연결된 속성이 자동으로 제거될 수 있습니다.

참고 항목

참조

EditingContext

Microsoft.Windows.Design.Services

GestureData

ModelDocumentTreeManager

기타 리소스

WPF Designer 확장성