Привязки не применяются к динамически загружаемому xaml - PullRequest
6 голосов
/ 22 сентября 2011

Я успешно использую XamlReader для загрузки файла xaml и создания FrameworkElement для работы.

Загружаемый xaml содержит выражения привязки, такие как:

<TextBlock Text="{Binding DataContextTextProperty}" />

Если я помещаю FrameworkElement, который я получаю из XamlReader.Load(), в окно WPF, то привязка работает нормально.

Однако в этом случае я использую Прекрасную статью Лорана Бюньона о создании PNG из WPF / XAML . Поскольку результат XamlReader.Load() записывается непосредственно в PNG через VisualBrush, кажется, что необходимая механика WPF для вызова выражений связывания обойдена.

Это заставляет меня поверить, что настоящие привязки на самом деле не вызываются просто путем вызова XamlReader.Load(), или что они не работают из-за чего-то, что я не знаю, связанного с отсутствием визуального дерева пока вы не добавите FrameworkElement в существующее визуальное дерево или что-то в этом роде.

Могу ли я что-нибудь сделать, чтобы эти привязки были вызваны?

Большое спасибо заранее.

1 Ответ

4 голосов
/ 22 сентября 2011

Я исправил это !!

Гм, позвольте мне объяснить ...

Я понятия не имею, как я дошел до этого сейчас, но я нашел полезную статью на MSDNОтносительно Инициализация для объектов не в дереве объектов .

В нем я нашел следующий пример кода:

Button b = new Button();
b.BeginInit();
b.Background = Brushes.Blue;
b.Width = b.Height = 200;
b.EndInit();
b.Measure(paperSize);
b.Arrange(new Rect(paperSize));
b.UpdateLayout();

Я посмотрел на (опять же, отличный) примерот Лорана, о котором я упоминал в приведенном выше вопросе, и настроил использование XamlReader следующим образом:

var element = (FrameworkElement)XamlReader.Load(xamlInput);

element.BeginInit();
element.DataContext = dataContext;

...

element.Measure(renderingSize);
element.Arrange(renderingRectangle);

element.EndInit();
element.UpdateLayout();

Я добавил BeginInit(), EndInit() и UpdateLayout() (хотя в процессе исключенияЯ считаю, что UpdateLayout() является ключом), и теперь выражения привязки в моем динамически загруженном xaml работают правильно.Ура!

...