7

C# コードで独自の DataTemplate を作成するためのスニペットを作成しました。そして、それをデータグリッド列の編集テンプレートに追加します。を呼び出すobject templateContent = tc.CellTemplate.LoadContent ( );と、アプリケーションがクラッシュし、「FrameworkElementFactory は、この操作のシールされたテンプレートにある必要があります。」という例外がスローされました。これは、データテンプレートを作成するコードです。

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

1 に答える 1

20

フレームワーク テンプレート コードをリフレクターに反映します。そして、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;
}
于 2011-08-09T01:46:39.637 に答える