【发布时间】:2011-11-22 03:24:18
【问题描述】:
创建一个 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>
提前致谢。
【问题讨论】:
-
我想我有答案了。绑定 IsSelected 属性,然后可以读取该属性的值,如果为 true,则返回真实文档,如果为 false,则返回一个小占位符。这篇文章的浏览量有限,没有 cmets 或答案,所以我将把它搁置几天,然后删除该帖子。它甚至会响应 NotifyPropertyChanged 并在选择选项卡时推送新内容 - 因为绑定是异步的,我担心它可能不会推送。