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