2011-08-23 17 views
6

Po przypisaniu obiektu do formantu Treść zmaterializuje wizualne odpowiednie dla tego przypisanego obiektu. Czy istnieje programowy sposób osiągnięcia tego samego rezultatu? Chciałbym wywołać funkcję w WPF z obiektem i odzyskać Visual, gdzie ta sama logika jest stosowana do generowania Visual, tak jakby dostarczono obiekt do instancji kontroli treści.WPF - Jak programowo zmaterializować obiekt do treści wizualnych?

Na przykład, jeśli mam obiekt POCO i przypisuję go do kontroli zawartości i zdarza się, że jest zdefiniowana odpowiednia DataTemplate, to zmaterializuje ten szablon, aby utworzyć obiekt Visual. Chciałbym, aby mój kod mógł zabrać obiekt POCO i wrócić z WPF the Visual.

Wszelkie pomysły?

Odpowiedz

8

Użyj DataTemplate.LoadContent(). Przykład:

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

Jeśli masz DataTemplate zdefiniowane dla wszystkich wystąpień danego typu (DataType = {x: Type ...}, ale nie ma x: Key = "...") następnie możesz utworzyć zawartość za pomocą odpowiedniego DataTemplate, korzystając z następującej metody statycznej. Ta metoda emuluje również ContentControl, zwracając TextBlock, jeśli nie znaleziono DataTemplate.

/// <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

Chcę coś, co robi dokładnie tak, jak robi klasa zawartości. tj. działa zgodnie z tą samą logiką, co sama kontrola treści. Kod jest dobry i byłby odpowiedni dla scenariusza DataTemplate. Ale może nie być zdefiniowana DataTemplate dla mojego POCO. –

+0

Jeśli nie ma pasujące DataTemplate, to wraca do tworzenia TextBlock i przy użyciu ToString() na obiekcie POCO, aby zdefiniować tekst. –

+0

Łatwo, po prostu zaktualizowałem metodę tworzenia TextBox zamiast zwracania wartości null, jeśli nie znaleziono DataTemplate. FYI - ContentControl wyświetli zawartość UIElement jako UIlement, więc nie używaj tej metody, jeśli masz już UOWY jako treść. –