2009-11-24 3 views
1

많은 DependencyProperties가있는 컨트롤 집합에서 작업하고 있습니다. 속성 자체는 DependencyObjects이며 속성의 get 메서드 중에 만들어집니다. Get 메서드 중 SetValue() 메서드를 사용하여 propertybag로 다시 설정되므로 Xaml에서 실제로 유효하며 속성은 시각적 트리에서 명시 적으로 만들지 않고도 스토리 보드로 만들 수 있습니다.PropertyValueEditor 및 DependencyObject in Blend 3 - Silverlight DesignTime 지원

이러한 DependencyObjects는 DataBinding을 지원하기 위해 DependencyProperties로 등록 정보를 모두 갖습니다. 그것들은 위에서 언급 한 것처럼 스토리 보드에서 사용할 수 있습니다.

동시에 이러한 속성에 대해 Blend 3에 대한 특별한 designtime 지원을 개발하고 InlineEditorTemplate을 컨트롤 형태로 만들었습니다. 나는 다음과 같은 한

 var vectorEditControl = new FrameworkElementFactory(typeof (VectorEditorControl)); 
     var dataTemplate = new DataTemplate {VisualTree = vectorEditControl}; 
     InlineEditorTemplate = dataTemplate; 

컨트롤에서 : 나는 템플릿을 생성하고이 같은 PropertyValueEditor 위해 설정

<Grid DataContext="{Binding Value}">

<StackPanel Orientation="Horizontal"> 
    <TextBox Text="{Binding Path=X, Mode=TwoWay}"/> 
    <TextBox Text="{Binding Path=Y, Mode=TwoWay}"/> 
    <TextBox Text="{Binding Path=Z, Mode=TwoWay}"/> 
</StackPanel> 

</Grid>

에디터가 나타나 데이터를 편집 할 수 있습니다. 디버깅 중에도 데이터가 실제로 DependencyObjects의 DependencyProperties로 다시 설정되지만 Xaml에는 아무런 변화가 없습니다. 따라서 데이터는 실제로 Xaml에서 어떤 식 으로든 유지되지 않으며 Xaml 파일을 닫고 다시 열 때 손실됩니다.

실제로 Xaml에 들어가기 위해 특별히해야 할 일이 있습니까? 나는 이것이 자동적으로 일어날 것이라는 인상을 받았다.

답변

1

뛰어난 질문!

블렌드/사이더의 PropertyEditors가 데이터 바인딩을 끝내는 것에 대한 오해의 핵심 문제입니다.
---- FooClass.BarProperty

는 (이제 우리는 PropertyEditor를이 시나리오를 살펴 보자 --- FooClass을 MyControl.MyProperty
- MyControl
-
:

이 개체 그래프를 고려 모든 유형의 : 인라인, 대화 상자 또는 확장)을 MyControl.MyProperty 속성에 추가합니다. MyPropertyPropertyEditor 내부에서 FooClass를 완전히 설정할 수 있고 멤버를 조작 할 수 있어야합니다. 그건 좋은 가정이지만, 잘못된 가정입니다.

핵심 문제는 디자인 타임에 Blend/Cider에 모델을 나타내는 정교한 데이터 구조가 있다는 것입니다. Blend/Cider가 실제 컨트롤과 상호 작용하는 방식에는 약 3-5 단계의 추상화가 있습니다.
이러한 추상화 수준을 만들면 Expression Blend/Visual Studio 디자이너가 프레임 워크 (Silverlight/WPF)간에 활용되고 고급 트랜잭션 (예 : 부동산 거래 및 속성 체인)을 지원할 수 있습니다.

그래서 DataBind에 실제로 도달하게되는 값은 그 추상화 수준 중 하나에 불과합니다.
나를 믿지 않습니까? 사용자 정의 PropertyEditor에서 this.DataContextChanged 이벤트에 등록하고 this.DataContext에서 유형을 체크 아웃하십시오.결국 PropertyValue 클래스 (또는 친구 중 하나)가됩니다.

XAML에 유지하려는 모든 속성 변경 사항 (디자인 화면에 표시됨)은 이러한 추상화 계층을 통과해야합니다.

자신에게 물어야 할 질문은 "내 PropertyValue.Value 속성 인스턴스에 대해 이러한 absteaction 클래스 중 하나를 어디서 얻습니까?"입니다.

음, MyControl.MyProperty를 중심으로 ModelItem을 만들고 PropertyEditor.DataContext로 설정했다면 어떻게할까요? 당신이 후속 질문을 가지고 있다면 Ning Zhang (Awesome Design Time Dev) explains about ModelItem

내가 실버 라이트를 통해 PeteBl 또는 UnniR 핑 생각 하는데요, Source Code : 우리는 차트 DefaultInitializer의 일환으로 실버 라이트 툴킷에 ModelFactory.CreateItem를 사용하는 예제를 제공 한 내부자 메일 링리스트. 감사합니다

,
는 - 저스틴

+0

감사합니다. 이제 저는 오늘 밤 벽에 머리를 대고 뛸 필요가 없습니다. –

0

그것은 부분적으로 내 문제를 해결합니다. 나는 후속 조치를 위해 UnniR과 대화를하고있다. 이 값을 PropertyValueEditor와 함께 사용하는 방법을 알 수는 없지만 기본값은 매우 뛰어나며 가능한 빨리 구현할 것입니다.

감사합니다.

관련 문제