2011-09-21 104 views
0

一個TabItem的內容是需要創建的大型CPU。希望只在IsSelected = True時通過綁定TabItem來獲取內容。或者根據IsSelected True或False獲取備用內容。在這種情況下放棄IsAsync = True不是一種選擇。WPF TabItem Desire綁定僅在發生IsSelected時發生True

下面的XAML工作,但無論IsSeleted = False還是IsSelected = True,它都會檢索內容。

<TabItem IsSelected="False" Header="Expensive Content"> 
     <FlowDocumentReader Name="FlowDocumentPageViewer1" HorizontalAlignment="Stretch" DataContext="{Binding Source={x:Static Application.Current}}"> 
      <FlowDocumentReader.Document> 
        <Binding Path="MyGabeLib.Search.SelectedDoc.XAMLdocFlowDocument" IsAsync="True" Converter="{StaticResource flowDocumentToXamlConverter}" 
         FallbackValue="{StaticResource DefaultFlowDoc}" Mode="OneWay"/> 
      </FlowDocumentReader.Document>           
     </FlowDocumentReader> 
    </TabItem> 

該轉換器是一個字符串(使用XamlWriter.Save(DocFlowDocument)序列)轉換回的FlowDocument作爲不能IsAsync =真(直接地)與的FlowDocument使用。

綁定到重定向後面的代碼中的屬性不起作用,因爲具有IsAcync = True的UI在另一個線程上,並且無法訪問IsSelected。

希望能夠使用帶觸發器的模板,但這是我得到的。不是很遠,但它不會引發語法錯誤。

<TabItem IsSelected="False" Name="TabItemFlowDoc">   
     <FlowDocumentReader ...> 
      <FlowDocumentReader.Template> 
       <ControlTemplate>    
       </ControlTemplate>  
      </FlowDocumentReader.Template> 
     </FlowDocumentReader> 

試圖觸發直接上的TabControl和甚至無法提前闖過語法錯誤

<TabControl Grid.Row="0" Grid.Column="0" Name="TabControlView"> 
     <TabControl.Resources> 
      <DataTemplate> 
       <FlowDocumentReader.Template>     
       </FlowDocumentReader.Template> 
      </DataTemplate> 
     </TabControl.Resources> 

感謝。

+0

我想我有一個答案。綁定IsSelected屬性,然後可以讀取該屬性的值,如果爲true,則返回真實文檔,如果爲false,則返回真實文檔。這篇文章的觀點有限,並且沒有評論或答案,所以我會在幾天後離開,然後刪除帖子。它甚至會響應NotifyPropertyChanged並在選中選項卡時推送新內容 - 因爲綁定是異步的,我擔心它可能不會推送。 – Paparazzi

回答

0

所以我最終做的是獲取文檔文本和其他參數以在後臺線程上標記它。然後在UI線程上,如果選中該選項卡,則檢查TabIndex,如果選中該選項卡,則只生成FlowDocument。另一個選項卡顯示文本的前4千個字符,以便用戶可以快速決定是否要渲染完整突出顯示的文檔。

相關問題