WPF TabControl与Pages

时间:2012-04-03 19:33:25

标签: wpf tabcontrol

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

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

2 个答案:

答案 0 :(得分:2)

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

对于您的第二个问题:是的,每个TabItem都可以拥有自己的DataContext。如果您使用TabControls ItemsSource来绑定项目列表,则每个DataContext的{​​{1}}将是列表中的一项。如果您手动添加TabItem,则可以将TabItems设置为:

DataContext

答案 1 :(得分:1)

它比你想象的要复杂得多。如果绑定到Tab Collection(想想MVVM),则只有在选中时才会创建选项卡。如果你留下一个标签然后回来它就会收集一个集合。如果您在XAML中创建选项卡,则选项卡将在窗口加载时生成。是的,您可以为每个选项卡使用不同的DataContext。我为延迟加载做的是绑定到TabItem属性IsSelected,如果它为false,则类中的所有属性都返回一个(快速)静态类型兼容值。如果IsSelected更改为true,那么我加载实际值并调用NotifyPropertyChanged(并保存实际值)。

我使用了这个,因为我加载了一个大对象,一个选项卡是摘要。选项卡不会虚拟化,但如果您有大型列表,那么肯定会在选项卡中使用虚拟化。您可以使用BackgroundWorker创建正确的工具,但是一旦它返回并绑定返回的值,UI就会被锁定,直到呈现UI控件。对我来说,重复使用单个框架与制表符是UI的一部分。只是为了分解代码,我通常会加载带有框架和页面的标签(我通常会将数据传递到ctor中的页面以加载动态内容)。