2009-12-14 12 views
5

Estoy tratando de agregar eventos y elementos mediante programación a un DataTemplate en una aplicación Silverlight 3.0. Tengo un Control de usuario con una propiedad de dependencia en el que me gustaría tomar la plantilla establecida, modificarla y luego configurar la versión modificada para que sea un control interno.¿Cómo modificar programáticamente una plantilla de datos?

La idea que tengo es tomar el DataTemplate que viene, leer su XAML, ajustarlo y luego usar el XamlReader para crear un DataTemplate modificado que luego se puede establecer en el control interno. El problema con este enfoque es que no sabe cómo conseguir el XAML de la plantilla originalal Por ejemplo (si es aún posible.):

protected virtual void OnItemTemplateChanged(DependencyPropertyChangedEventArgs e) 
{ 
    // Get the original Xaml from the set template 
    //string originalXaml = ??? 

    // Modify the template 
    string newXaml = originalXaml.Replace("foo", "bar"); // for example 

    // Create a new template from the modified XAML 
    DataTemplate newTemplate = (DataTemplate)XamlReader.Load(newXaml); 

    // Update the inner template 
    this._childDropdown.ItemTemplate = newTemplate; 
} 

¿Alguien sabe ya sea: 1) si hay una manera de leer el XAML original, o 2) otro enfoque para modificar programáticamente el DataTemplate.

Gracias,

Respuesta

1

No se puede manipular la plantilla a través de código (véase la documentación para FrameworkTemplate). Lo más cerca que va a llegar es llamar al LoadContent de DataTemplate para crear una instancia del Xaml contenido, pero no puede usar eso para manipular el contenido y no hay manera dentro de Silverlight de convertir un UIElement nuevamente a Xaml.

Lo más cercano que creo que puede obtener es hacer que su objeto de dependencia sea un URI que apunta a un recurso de Xaml que contiene el DataTemplate inicial.

Puede cargar este recurso en un XDocument y manipularlo como XML. Posteriormente puede usar XamlReader para instanciar el DataTemplate y asignarlo al ItemTemplate.

+0

I (a regañadientes) reelaborado mi proyecto para que no requiera la manipulación del DataTemplate. No es lo que quería, pero al menos no estoy perdiendo más tiempo tratando de hacer esto. Gracias, espero que una versión futura de Silverlight permita cierta manipulación programática de DataTemplate. –

+0

Creo que lo que me gustaría ver es la capacidad de reemplazar un ItemControl ItemContainerGenerator con un generador personalizado que no podemos por el momento, tendré que buscar SL4 para ver si lo permite. – AnthonyWJones

Cuestiones relacionadas