我正在创建一个资源密集型仪表板应用程序,它将具有许多数据可视化区域。我认为最好使用一个框架并使用WPF页面一次加载一个页面。这些页面也会有不同的数据上下文,安全限制等。但是,另一位开发人员说我可以使用TabControl完成同样的事情。
TabControl在应用程序启动时是否一次加载所有选项卡中的所有项目?或者,我是否可以像WPF页面一样懒得加载它们(页面只在导航时加载内容)?另外,TabControl中每个项目可以有不同的数据上下文吗?
答案 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中的页面以加载动态内容)。