FrameworkElementFactory должен быть в запечатанном шаблоне для этой операции - PullRequest
6 голосов
/ 08 августа 2011

Я написал фрагмент для создания собственного DataTemplate с помощью кода C #.И я добавляю его в шаблон редактирования столбца таблицы данных.Когда я позвонил 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;
    }

1 Ответ

15 голосов
/ 09 августа 2011

Я отражаю код шаблона рамки в отражателе. И я обнаружил, что tc.CellTemplate.LoadContent () связан с закрытым полем с именем «_sealed» в классе FrameworkTemplate.

Затем я нашел поле, в котором будет задано значение, и я вызываю этот метод, проблема решена.

Вот решение:

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