2008-09-12 8 views
28

¿Cómo creo una plantilla de datos Silverlight en el código? He visto muchos ejemplos para WPF, pero nada para Silverlight.Creación de un DataTemplate de Silverlight en el código

Editar: Aquí está el código para el que ahora estoy usando esto, basado en la respuesta de Santiago a continuación.

public DataTemplate Create(Type type) 
{ 
    return (DataTemplate)XamlReader.Load(
      @"<DataTemplate 
      xmlns=""http://schemas.microsoft.com/client/2007""> 
      <" + type.Name + @" Text=""{Binding " + ShowColumn + @"}""/> 
      </DataTemplate>" 
    ); 
} 

Esto funciona muy bien y me permite cambiar la encuadernación sobre la marcha.

+0

no pude hacer que esto funcione Problemas explicados [aquí] (http://stackoverflow.com/questions/7170937/problems-with-xamlreader-generating-datatemplate) – Caustix

Respuesta

39

Aunque no se puede programáticamente crearlo, puede cargarlo desde una cadena XAML en código como este:

public static DataTemplate Create(Type type) 
    { 
     return (DataTemplate) XamlReader.Load(
      @"<DataTemplate 
       xmlns=""http://schemas.microsoft.com/client/2007""> 
       <" + type.Name + @"/> 
       </DataTemplate>" 
     ); 
    } 

El fragmento anterior crea una plantilla de datos que contiene un solo control, que puede ser un usuario controlar con los contenidos que necesitas.

+0

¡Gran respuesta, ni idea de por qué no pensé en ella! –

2

citation from MSDN:

El uso XAML que define el contenido para la creación de una plantilla de datos no está expuesto como una propiedad ajustable. Es un comportamiento especial integrado en el procesamiento XAML de un elemento de objeto DataTemplate.

+0

¿Dónde lo encontraste? ¿Puedes proporcionar una URL? –

+1

http://msdn.microsoft.com/en-us/library/system.windows.datatemplate% 28v = vs.95% 29.aspx – jarda

11

Tuve algunos problemas con este código, obteniendo excepciones de elemento no seleccionado. Sólo como referencia, que era lo que necesitaba mi namesspace incluido en el DataTemplate ...

private DataTemplate Create(Type type) 
     { 
      string xaml = @"<DataTemplate 
       xmlns=""http://schemas.microsoft.com/client/2007"" 
       xmlns:controls=""clr-namespace:" + type.Namespace + @";assembly=" + type.Namespace + @"""> 
       <controls:" + type.Name + @"/></DataTemplate>"; 
      return (DataTemplate)XamlReader.Load(xaml); 
     } 
+0

No necesita la instrucción "DataTemplate dt = new DataTemplate();" porque no se usa –

+4

** Nombre de conjunto! = Nombre de espacio de nombres ** though. – herzmeister

4

Sí, Silverligt 4 Mayor de las versiones actuales de WPF. Cuando agrega una plantilla como recurso, es decir, como hice , agregué una plantilla de UserControl en Application.xaml MergedResources entre ResourceDictionary. En XAML si la etiqueta implementada IDictionary puede usar x: atributo clave. Al igual que

<ResourceDictionary> 
    <DataTemplate x:Key="TextBoxEditTemplate"> 
    <Some user control x:Name="myOwnControl" /> 
    </DataTemplate> 
    </ResourceDictionary> 

Ok! Puede acceder a su plantilla codificando que, Application.Current.resources ["TextBoxEditTemplate"] , por otro lado, algunos métodos para encontrar miembros de esta plantilla no funcionarán. Además de esto, DataTemplate no implementa IDictionary, por lo que no puede asignar atributos x: Key para los elementos en este dataTemplate. como myOwnControl en el ejemplo.

Sin xaml current silverlight tiene algunas restricciones sobre la creación completamente dinámica de código detrás de DataTemplates.Incluso funciona en WPF.

De todos modos, la mejor solución para este punto es la creación del script XAML para datatemplate. Puede asignar algún elemento de valores al script DataTemplate. Creamos nuestros propios controles de usuario que tienen algunas propiedades con DependencyObjectProperty ...

Por último, si su objeto no tiene herencia, es decir. No es un MyControl: control de usuario puede heredar MiObjeto: DependencyObject de esta manera se puede llegar a su objeto llamando al igual que Application.Current.Resources.FirstChilderen ...

FindName sólo funciona en WPF

Cuestiones relacionadas