2011-08-23 3 views
6

콘텐츠 컨트롤에 개체를 할당하면 할당 된 개체에 적합한 Visual을 구체화합니다. 동일한 결과를 얻기위한 프로그래밍 방식이 있습니까? WPF에서 객체로 함수를 호출하고 객체를 Content 컨트롤 인스턴스에 제공 한 것처럼 Visual을 생성하는 데 동일한 로직이 적용되는 Visual을 다시 얻고 싶습니다.WPF - 시각적 콘텐츠로 개체를 프로그래밍 방식으로 구체화하는 방법?

예를 들어 POCO 개체가 있고 콘텐츠 컨트롤에 할당하고 적절한 DataTemplate이 정의 된 경우 Visual을 만들기 위해 해당 템플릿을 구체화합니다. 내 코드는 POCO 객체를 가져 와서 WPF에서 다시 가져올 수 있기를 바랍니다.

아이디어가 있으십니까?

답변

8

DataTemplate.LoadContent()를 사용하십시오. 예 :

DataTemplate dataTemplate = this.Resources["MyDataTemplate"] as DataTemplate; 
FrameworkElement frameworkElement = dataTemplate.LoadContent() as FrameworkElement; 
frameworkElement.DataContext = myPOCOInstance; 

LayoutRoot.Children.Add(frameworkElement); 

http://msdn.microsoft.com/en-us/library/system.windows.frameworktemplate.loadcontent.aspx

당신이 유형의 모든 인스턴스에 대해 정의 된 DataTemplate이있는 경우 (데이터 형식 = {X : 유형 ...}하지만 X : 키 =을 "...") 다음 정적 메서드를 사용하여 적절한 DataTemplate을 사용하여 내용을 만들 수 있습니다. 또한이 메서드는 DataTemplate이 없으면 TextBlock을 반환하여 ContentControl을 에뮬레이션합니다.

/// <summary> 
/// Create content for an object based on a DataType scoped DataTemplate 
/// </summary> 
/// <param name="sourceObject">Object to create the content from</param> 
/// <param name="resourceDictionary">ResourceDictionary to search for the DataTemplate</param> 
/// <returns>Returns the root element of the content</returns> 
public static FrameworkElement CreateFrameworkElementFromObject(object sourceObject, ResourceDictionary resourceDictionary) 
{ 
    // Find a DataTemplate defined for the DataType 
    DataTemplate dataTemplate = resourceDictionary[new DataTemplateKey(sourceObject.GetType())] as DataTemplate; 
    if (dataTemplate != null) 
    { 
     // Load the content for the DataTemplate 
     FrameworkElement frameworkElement = dataTemplate.LoadContent() as FrameworkElement; 

     // Set the DataContext of the loaded content to the supplied object 
     frameworkElement.DataContext = sourceObject; 

     // Return the content 
     return frameworkElement; 
    } 

    // Return a TextBlock if no DataTemplate is found for the source object data type 
    TextBlock textBlock = new TextBlock(); 
    Binding binding = new Binding(String.Empty); 
    binding.Source = sourceObject; 
    textBlock.SetBinding(TextBlock.TextProperty, binding); 
    return textBlock; 
} 
+0

콘텐츠 클래스와 정확히 똑같은 기능을 원합니다. 즉 콘텐츠 컨트롤 자체와 동일한 논리를 따릅니다. 당신은 코드가 좋고 DataTemplate 시나리오에서는 괜찮을 것이다. 하지만 내 POCO에 대해 정의 된 DataTemplate이 없을 수도 있습니다. –

+0

일치하는 DataTemplate이 없으면 TextBlock을 만들고 POCO 객체에서 ToString()을 사용하여 텍스트를 정의합니다. –

+0

간단히 말해 DataTemplate이 없으면 null을 반환하는 대신 TextBox를 만드는 메서드를 업데이트했습니다. FYI - ContentControl은 UIElement 내용을 UIElement로 표시하므로 이미 UIElement가 내용 인 경우이 메서드를 사용하지 마십시오. –