Pregunta

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

Editar:Aquí está el código para el que estoy usando esto ahora, según 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 fijación sobre la marcha.

¿Fue útil?

Solución

Aunque no puedes crearlo mediante programación, puedes cargarlo desde una cadena XAML en un 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 único control, que puede ser un control de usuario con el contenido que necesita.

Otros consejos

Tuve algunos problemas con este código, obteniendo excepciones de elementos no encontrados.Solo como referencia, era que necesitaba que mi espacio de nombres estuviera incluido en 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);
        }

Sí, Silverligt 4 es anterior a las versiones actuales de WPF.Cuando agrega una plantilla como recurso, es decirComo lo hice, agregué una plantilla de UserControl en Application.xaml MergedResources entre ResourceDictionary.En XAML, si la etiqueta implementó IDictionary, podría utilizar el atributo x:Key.Como eso

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

¡De acuerdo!Puede llegar a su plantilla codificándola, Aplicación.Current.resources["TextBoxEditTemplate"]por otro lado, algunos métodos para encontrar miembros de esta plantilla no funcionarán.Además, DataTemplate no implementa IDictionary, por lo que no puede asignar el atributo x:Key para los elementos de este dataTemplate.como myOwnControl en el ejemplo.

Sin xaml, Silverlight actual tiene algunas restricciones sobre la creación de plantillas de datos de código subyacente completamente dinámicas. Incluso funciona en WPF.

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

Por último, si su objeto no tiene herencias, es decir.no es un MyControl:UserControl que puedes heredar MiObjeto:ObjetoDependencia de esta manera puede llegar a su objeto llamando como Application.Current.Resources.FirstChilderen...

FindName funciona sólo en WPF

cita de MSDN:

El uso de XAML que define el contenido para crear una plantilla de datos no se expone como una propiedad configurable.Es un comportamiento especial integrado en el procesamiento XAML de un elemento de objeto DataTemplate.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top