目前我正在設計一個應用程序,該應用程序應該能夠使用數據綁定(涉及FlowDocument
)從Xaml模板文件創建報告。爲什麼數據綁定在動態加載的控制中斷?
這個想法是簡單地通過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>
裏面的「元素」命名BlockUIContainer的<Grid ... />
控制就像之前示例中使用的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; }));
但是,這裏的數據綁定並未評估。在設置DataContext
之後,我嘗試在FrameworkElement
上調用UpdateLayout()
方法。 這確實至少評估<DataTrigger Binding="{Binding Path=DangerousGoods}" />
中某些綁定的<Style>
元素設置某些子控件的可見性,但沒有任何綁定如<TextBlock Text="{Binding Path=Country}" />
未被評估。
我在這裏不知所措。解析後如何讓剩餘的綁定再次工作?我真的不想爲一個文檔創建多個文件。