2012-04-03 98 views
2

我正在创建一个资源密集的仪表板应用程序,该应用程序将具有许多数据可视化区域。我认为最好使用框架并使用WPF页面一次加载一个页面。这些页面也会有不同的数据上下文和安全限制等。但是,另一位开发人员说我可以使用TabControl完成同样的事情。WPF TabControl与Pages

在应用程序启动时,TabControl是否一次加载所有选项卡中的所有项目?或者,我可以像使用WPF页面一样懒惰地加载它们(页面只在导航时加载内容)?另外,你可以在TabControl中每个项目有不同的数据上下文吗?

回答

2

在WPF中,您可以使用UI虚拟化,这意味着只有可见控件才会被初始化并呈现。据我所知,默认情况下,TabControl不支持UI虚拟化,但也许可以手动添加它或使用其他控件。也许你想看看下面的article,它提供了一些性能提示。还有人提到UI和数据虚拟化之间存在差异。不显示控件并不意味着底层数据不在内存中。所有绑定目标都将被加载,但控件不会被渲染。

第二个问题:是的,每TabItem可以有自己的DataContext。如果使用TabControls ItemsSource绑定项目列表,则DataContextTabItem)将成为列表中的一项。如果手动添加TabItems,您可以设置DataContext这样的:

<TabControl> 
    <TabItem DataContext="{Binding Context1}" /> 
    <TabItem DataContext="{Binding Context2}" /> 
</TabControl> 
1

更复杂的比你猜。如果绑定到Tab Collection(认为MVVM),那么该选项卡仅在被选中时才被创建。如果你留下一个标签并回来,它会重新构建。如果您在XAML中创建了选项卡,那么这些选项卡都将在窗口加载时生成。是的,您可以为每个选项卡使用不同的DataContext。我为延迟加载做的事情是绑定到TabItem属性IsSelected,如果它是false,则该类中的所有属性只返回(快速)静态类型兼容值。如果IsSelected更改为true,则我加载实际值并调用NotifyPropertyChanged(并保存实际值)。

我使用heck out这是我加载一个大对象和一个选项卡是一个总结。标签不能虚拟化,但如果你有大的列表,那么肯定在标签中使用虚拟化。你可以使用BackgroundWorker来创建合适的网页,但是一旦它返回并且你绑定了返回的值,UI就会被锁定,直到呈现UI控件。对我来说重复使用一个框架与标签是一个UI的事情。为了分解代码,我通常会加载一个带有框架和页面的选项卡(我通常会将数据传递到ctor中的页面以加载动态内容)。