FrameworkElementFactory必须位于此操作的密封模板中

时间:2011-08-08 09:17:58

标签: wpf exception datatemplate wpfdatagrid frameworkelementfactory

我编写了一个代码片段来通过c#代码创建自己的DataTemplate。然后我将它添加到datagrid列的编辑模板中。 当我调用object templateContent = tc.CellTemplate.LoadContent ( );时,应用程序崩溃,并抛出一个异常,“FrameworkElementFactory必须在此操作的密封模板中。”。 这是我创建datatemplate的代码。

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;
    }

1 个答案:

答案 0 :(得分:15)

我在反射器中反映了框架模板代码。我发现tc.CellTemplate.LoadContent()与FrameworkTemplate类中名为“_sealed”的私有字段有关。

然后我找到了设置值的字段,我调用这个方法,问题就解决了。

以下是解决方案:

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;
}