当IsSelected为True时,WPF TabItem Desire绑定仅发生

时间:2011-09-21 16:43:33

标签: wpf binding tabitem

一个TabItem的内容是创建的昂贵的CPU。想要仅在IsSelected = True时通过TabItem的绑定获取内容。或者根据IsSelected True或False获取备用内容。在这种情况下放弃IsAsync = 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 = True(直接)与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>

提前致谢。

1 个答案:

答案 0 :(得分:0)

所以我最终做的是获取文档文本和其他参数以在后台线程上标记它。然后在UI线程上,如果选中该选项卡,则检查TabIndex,如果选中该选项卡,则仅生成FlowDocument。另一个选项卡显示文本的前4000个字符,以便用户可以快速决定是否要呈现完整突出显示的文档。