5

Escribí un fragmento para crear un propio DataTemplate por código C#. Y lo agrego a la plantilla de edición de la columna de cuadrícula de datos. Cuando llamé al object templateContent = tc.CellTemplate.LoadContent ();, la aplicación se bloqueó, y me arrojó una excepción que es "FrameworkElementFactory debe estar en una plantilla sellada para esta operación". Este es el código que creo mi datatemplate.FrameworkElementFactory debe estar en una plantilla sellada para esta operación

public override DataTemplate GenerateCellTemplate (string propertyName) 
    { 
     DataTemplate template = new DataTemplate (); 
     var textBlockName = string.Format ("{0}_TextBlock", propertyName); 
     FrameworkElementFactory textBoxElement = new FrameworkElementFactory (typeof (TextBlock), textBlockName); 
     textBoxElement.SetBinding (TextBlock.TextProperty, new Binding (propertyName)); 
     template.VisualTree = textBoxElement; 
     Trigger trigger = new Trigger (); 
     return template; 
    } 

Respuesta

13

Reflejo el código de la plantilla de marco en el reflector. Y encontré tc.CellTemplate.LoadContent() se refiere a un campo privado llamado "_sealed" en la clase FrameworkTemplate.

Luego encontré el campo donde establecer el valor, y llamo a este método, el problema está resuelto.

Aquí está la solución:

public override DataTemplate GenerateCellTemplate (string propertyName) 
{ 
    DataTemplate template = new DataTemplate (); 
    var textBlockName = string.Format ("{0}_TextBlock", propertyName); 
    FrameworkElementFactory textBoxElement = new FrameworkElementFactory (typeof (TextBlock), textBlockName); 
    textBoxElement.SetBinding (TextBlock.TextProperty, new Binding (propertyName)); 
    template.VisualTree = textBoxElement; 
    Trigger trigger = new Trigger (); 

    // This solves it! 
    template.Seal(); 

    return template; 
} 
+2

You rock! ¡Gracias! – Marc

+2

He estado creando DataTemplates dinámicamente con un Telerik GridView y tuve que llamar a Seal() para que funcione. ¿Sabes por qué? No pude encontrar ningún ejemplo de por qué debería usarse esto? –

Cuestiones relacionadas