В настоящее время я разрабатываю приложение, которое в какой-то момент может создать отчет из файла шаблона 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
s динамически в соответствии с набором данных. Мне нужно сделать это в коде для реализации пользовательской разбивки на страницы, потому что отчеты могут быть длиннее одной страницы.
Поскольку я хочу только одного файла шаблона, я упаковал свой заголовок, колонтитул и группировка контролирует все в одном файле 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 это как раз именно элемент управления сеткой, используемый в предыдущем примере.
Теперь все, что я делаю, это получить дочерний элемент 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}" />
, не оценивается.
Я в затруднении здесь. Как заставить остальные привязки работать снова после их разбора? Я не хочу создавать несколько файлов для одного документа.