2016-03-10 4 views
0

В настоящее время я разрабатываю приложение, которое в какой-то момент может создать отчет из файла шаблона 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}" />, не оценивается.

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

ответ

0

Nevermind, я нашел ошибку ... Привязка получает оценку при первом создании элемента управления. XamlWriter затем «уничтожает» привязку, оценивая текст и записывая исходный текст (который был пуст) в свойство элемента Text.