PropertyGrid 컨트롤의 WPF "Magic"
-
10-07-2019 - |
문제
나는 WPF에 대해 배우기 위해 취미 프로젝트를 시작했고 내 재구성 에서이 WPF PropertyGrid를 밟았습니다. http://www.codeplex.com/wpg
소스를 다운로드했습니다 http://wpg.codeplex.com/sourcecontrol/listdownloadablecommits.aspx, 그것을 탐색하기 시작했고, 멋져 보이고, 작동합니다. 그러나 내 삶을 위해, 나는 그것이 어떻게 작동하는지 알 수 없습니다. 다음 질문은 언뜻보기에 남은 것입니다.
- 객체가 어떤 속성을 가지고 있는지 어떻게 알 수 있습니까?
- 컨트롤이 값을 편집하기 위해 어떻게 렌더링합니까?
- 렌더링 할 제어가 어떻게 결정됩니까? (속성에 대한 메타 데이터 설명을 추측하고 있습니다)
EppendancyProperties가 새 값 사이의 DataExChange를 처리한다는 것을 이해합니다.
- 모든 마술을하는 XAML 또는 CodeBehind 코드는 어디에 있습니까?
default.xaml 파일에는 많은 xaml 코드가 있지만, 내가 말할 수있는 한, 그것은 단지 스타일과 그곳에 정의 된 외관입니다.
해결책
- 객체가 어떤 속성을 가지고 있는지 어떻게 알 수 있습니까?
사용합니다 System.ComponentModel.TypeDescriptor
유형이 보유한 속성을 결정합니다 TypeDescriptor.GetProperties
. ㅏ PropertyDescriptor
각 재산에 대한 풍부한 정보를 제공합니다 (예 : PropertyDescriptor.IsReadOnly
재산이 준비되어 있다고 말할 것입니다). 또한 사용 PropertyDescriptor.GetValue
그리고 PropertyDescriptor.SetValue
, 속성의 값은 얻어지고 기록 할 수 있습니다.
- 컨트롤이 값을 편집하기 위해 어떻게 렌더링합니까?
- 렌더링 할 제어가 어떻게 결정됩니까? (속성에 대한 메타 데이터 설명을 추측하고 있습니다)
a라는 사용자 정의 컨트롤을 사용합니다 PropertyGrid
노출 ObservableCollection
의 Item
에스. Item
핵심 모델 객체의 기본 클래스 일뿐입니다. Property
. Property
기본 유형을 드러냅니다 (PropertyDescritor.PropertyType
) 재산의) PropertyDescriptor.GetValue
그리고 PropertyDescriptor.SetValue
방법을 통한 방법 Property.Value
. 이것은 결국 편집을 가능하게하는 것입니다. DataTemplate
에스 여기서 열쇠입니다. 몇 가지 CLR 유형에는 사용자 정의가 있습니다 DataTemplate
당신이 보는 컨트롤을 렌더링하는 s. 예를 들어, Boolean
유형은 a로 렌더링됩니다 CheckBox
an Enum
a ComboBox
. 기본값 DataTemplate
a TextBox
.
- 모든 마술을하는 XAML 또는 CodeBehind 코드는 어디에 있습니까?
그것의 성향이 있습니다 Themes\Default.xaml
.
코드는 따라서 요약 될 수 있습니다. 데이터가 있습니다 (Data\Property
) 객체의 속성에 대한 정보를 캡슐화하고 속성을 제공합니다 (Property.Value
) 재산의 가치를 읽고 쓰기 위해. 이 데이터는 An으로 노출됩니다 ObservableCollection
사용자 정의 컨트롤에서 (PropertyGrid
) 사용을 렌더링합니다 DataTemplate
s in Themes\Default.xaml
.
default.xaml 파일에는 많은 xaml 코드가 있지만, 내가 말할 수있는 한, 그것은 단지 스타일과 그곳에 정의 된 외관입니다.
간과하지 마십시오 DataTemplate
에스.
다른 팁
- 객체가 어떤 속성을 가지고 있는지 어떻게 알 수 있습니까?
Windows가 속성 그리드를 형성하는 것과 동일한 방식으로 작동하면 다음을 수행합니다.
- 객체가 iCustomtypedescriptor를 구현하는 경우이 인터페이스에서 속성을 얻습니다 (GetProperties 메소드와 함께)
- 그렇지 않으면 객체의 유형에 반사를 사용하십시오 (obj.gettype (). getProperties ()
다른 질문들에게 ... 글쎄, 나는 코드를 보지 않았으므로 대답 할 수 없다;)