Почему привязка данных к динамически загружаемому элементу управления нарушается?

В настоящее время я разрабатываю приложение, которое в какой-то момент должно быть в состоянии создать отчет из файла шаблона Xaml с использованием привязки данных (включая FlowDocument).

Идея состояла в том, чтобы просто преобразовать динамически загруженный элемент управления через BlockUIContainer для печати в FlowDocument.

Пока я загружаю весь файл в один FrameworkElement и установить DataContext Привязка данных работает как шарм.

foreach (Order order in orders)
{
    BlockUIContainer container = new BlockUIContainer();
    container.Child = (FrameworkElement)GetOrderControl();
    (container.Child as FrameworkElement).DataContext = order;
    document.Blocks.Add(container);
}
Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.SystemIdle,
    new Action(() => { return; }));

Все GetOrderControl() метод это читать из FileStream разбирать контент через XamlReader.Load(), Файл структурирован так:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    ...
    <TextBlock Text="{Binding Path=Country}" />
    ...
</Gird>

Теперь приложение должно добавить BlockUIContainerдинамически в соответствии с набором данных. Мне нужно сделать это в коде, чтобы реализовать пользовательскую нумерацию страниц, потому что отчеты могут занимать больше одной страницы.

Так как мне нужен только один файл шаблона, я упаковал элементы управления заголовка, нижнего колонтитула и группировки в один файл xaml, например так:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <BlockUIContainer Name="PageHeader">
        <Grid ... />
    </BlockUIContainer>
    <BlockUIContainer Name="Element">
        <Grid ... />
    </BlockUIContainer>
</FlowDocument>

<Grid ... /> Элемент управления внутри "Элемента" с именем BlockUIContainer является именно тем элементом управления Grid, который использовался в предыдущем примере.

Теперь все, что я делаю, это получаю дочерний элемент BlockUIContainer и создаю копию этого, сохраняя его в строку и обратно в FrameworkElement и установить DataContext,

foreach (Order order in orders)
{
    BlockUIContainer container = new BlockUIContainer();
    container.Child = (FrameworkElement)XamlReader.Parse(XamlWriter.Save(elementControl));
    (container.Child as FrameworkElement).DataContext = order;
    document.Blocks.Add(container);
}
Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.SystemIdle,
    new Action(() => { return; }));

Здесь, однако, привязка данных не оценивается. Я пытался позвонить UpdateLayout() метод на FrameworkElement после настройки DataContext, Это оценивает, по крайней мере, некоторые Привязки в <DataTrigger Binding="{Binding Path=DangerousGoods}" /> для <Style> Элемент, устанавливающий видимость некоторых дочерних элементов управления, но ни один из таких привязок, как <TextBlock Text="{Binding Path=Country}" /> не оцениваются.

Я в недоумении здесь. Как заставить оставшиеся привязки снова работать после их анализа? Я не хочу создавать несколько файлов для одного документа.

1 ответ

Решение

Неважно, я обнаружил ошибку... Привязки оцениваются при первом создании элемента управления. XamlWriter затем "разрушает" Binding, оценивая текст и записывая исходный текстовый вывод (который был пустым) в элемент Text имущество.

Другие вопросы по тегам