2011-08-23 14 views
6

Cuando se asigna un objeto a un control de contenido que se materializará un Visual apropiado para ese objeto asignado. ¿Hay una forma programática para lograr el mismo resultado? Me gustaría llamar a una función en WPF con un objeto y volver a Visual, donde se aplica la misma lógica en la generación de la visual como si se hubiera suministrado el objeto a una instancia de control de contenido.WPF - ¿Cómo se materialice mediante programación objeto de contenido visual?

Por ejemplo, si tengo un objeto POCO y lo asigno a un control de contenido y resulta que hay un DataTemplate apropiado definido, entonces se materializa esa plantilla para crear el Visual. Me gustaría que mi código pueda tomar un objeto POCO y regresar de WPF a Visual.

¿Alguna idea?

Respuesta

8

Uso DataTemplate.LoadContent(). Ejemplo:

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

Si usted tiene un DataTemplate definido para todas las instancias de un tipo (Tipo de datos = {x: Tipo ...}, pero no x: Key = "...") luego puede crear contenido utilizando la DataTemplate apropiada utilizando el siguiente método estático. Este método también emula ContentControl devolviendo un TextBlock si no se encuentra 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

Quiero algo que haga exactamente lo que hace la clase Contenido. es decir, sigue la misma lógica que el control de contenido en sí. Tu código es bueno y estaría bien para el escenario de DataTemplate. Pero puede que no haya definido una DataTemplate para mi POCO. –

+0

Si no hay ningún DataTemplate coincidente, volverá a crear un TextBlock y usar ToString() en el objeto POCO para definir el texto. –

+0

bastante fácil, me acaba de actualizar el método para crear un cuadro de texto en lugar de devolver un valor nulo si no se encuentra ninguna DataTemplate. FYI - ContentControl muestra contenido UIElement como UIElement, así que no se utilice este método si ya tiene un UIElement como contenido. –

Cuestiones relacionadas