2009-12-18 2 views
1

System.Windows.DispatcherObject에서 파생 된 개체가 있지만 ControlTemplate을 정의한 경우바인딩을 통해 비 UIElement 렌더링

public class B 
{ 
    public A NonUIElement {get; set;} 
} 

의 구성원

public class A : System.Windows.DependencyObject 
{ 
    public ControlTemplate ControlTemplate {get; set;} 
} 

테두리 DataContext가 B의 인스턴스로 설정되었다고 가정 결합 등

<Border Name="Border"> 
<ContentPresenter Margin="5,0" Content="{Binding NonUIElement }"/> 
</Border> 

에서이 오브젝트를 렌더링하는 것이 가능 ?

+0

네, 작동해야합니다. 시도해 보셨습니까? –

답변

3

개체가 렌더링되지만 사용자가 원하는 방식으로 렌더링되지는 않습니다. ContentPresenterThe Content은 A의 인스턴스로 설정됩니다. WPF는 A의이 인스턴스를 렌더링하는 방법을 파악하려고 시도합니다. 먼저이 개체는 UIElement입니까? 이 경우 대답은 '아니오'입니다. 그러면 유형에 대해 DataTemplate을 찾습니다. 이 경우 A 클래스에는 DataTemplate이 없습니다. 따라서 ToString()을 호출하면 다시 실패합니다. 따라서 ContentPresenter에 "YourNamespace.A"라는 텍스트가 포함 된 TextBlock이 표시됩니다.

A가 AControlTemplate 유형의 구성원을 가지고 있다는 사실은이 논리에 영향을주지 않습니다. WPF는 A가 수행하는 데이터 덩어리입니다. WPF 만 은 컨트롤이 관련되어 있고 ControlTemplateTemplate 속성에 할당되어있는 경우ControlTemplate을 사용합니다.

그래서 당신은 하나의 DataTemplate를 제공해야 A (물론 ControlTemplate에 액세스하고 인스턴스를 렌더링하는 데 사용할 수있는) 또는 명명 된 DataTemplate을 만들고 ContentPresenter.ContentTemplate를 통해, 또는 그 대신 UIElement에서 파생 것을 적용한다.

+0

우수 설명, 감사합니다. 그러나, 내가 DataTemplate을 A에 공급해야한다고 말할 때, HierarchicalDataTemplate 내에서이 데이터를 할당해야합니다. –

+0

아마도 가장 쉬운 방법은 ContentPresenter.ContentTemplate 속성에 할당하는 것입니다. '' – itowlson

+0

WPF를 사용하면 제안에 지정된 ContentPresenter 내에서 렌더링하려고하기 전에 NonUIElement의 ControlTemplate을 찾을 수 있습니다. 왜 계속 DataTemplate을 제공해야합니까? 이 는 암시 적이 아님을 의미합니까? "NonUIElement의 ControlTemplate을 사용하여 내용을 렌더링 하시겠습니까?" –

0

나는 이것을 가지고 마침내 얻었습니다.

<HierarchicalDataTemplate DataType="{x:Type vm:MapLayerModel}" ItemsSource="{Binding Path=Children, Mode=OneTime}"> 
**<ContentControl Margin="5" Content="{Binding LayerRepresentation}" Template="{Binding LayerRepresentation.ControlTemplate}" Mode=OneTime/>** 
</HierarchicalDataTemplate> 

이것은 WPF 템플릿 및 콘텐츠 제어 모델에 대한 훌륭한 개인 교훈입니다. 다시 한번 감사드립니다.

관련 문제