2016-03-10 25 views
0

目前我正在設計一個應用程序,該應用程序應該能夠使用數據綁定(涉及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}" />未被評估。

我在這裏不知所措。解析後如何讓剩餘的綁定再次工作?我真的不想爲一個文檔創建多個文件。

回答

0

沒關係,我發現錯誤...在第一次創建控件時,綁定會被評估。 XamlWriter然後通過評估文本並將原始文本輸出(它是空的)寫入元素的Text屬性中來「銷燬」綁定。

相關問題