我正在创建一个资源密集型仪表板应用程序,它将具有许多数据可视化领域。我认为最好使用一个框架,并使用WPF页面一次加载一个所需的页面。这些页面也会有不同的数据上下文,安全限制等。但是,另一位开发人员说,我可以使用TabControl来完成相同的事情。
在应用程序启动时,TabControl是否一次加载所有选项卡中的所有项?或者,我是否可以像WPF页面那样根据需要延迟加载它们(页面只在导航到时加载内容)?另外,您可以在TabControl中为每个项目提供不同的数据上下文吗?
发布于 2012-04-04 03:51:10
在WPF中,您可以使用UI虚拟化,这意味着只初始化和呈现可见的控件。据我所知,TabControl
默认情况下不支持UI虚拟化,但也许您可以手动添加它或使用其他控件。也许你想看看下面的article,它提供了一些性能提示。还提到了UI和数据虚拟化之间的区别。不显示控件并不意味着基础数据不在内存中。将加载所有绑定目标,但不会呈现控件。
关于你的第二个问题:是的,每个TabItem
都可以有自己的DataContext
。如果使用TabControls ItemsSource
绑定项目列表,则每个TabItem
的DataContext
都将是列表中的一个项目。如果您手动添加TabItems
,您可以这样设置DataContext
:
<TabControl>
<TabItem DataContext="{Binding Context1}" />
<TabItem DataContext="{Binding Context2}" />
</TabControl>
发布于 2012-04-04 04:37:34
它比你想象的要复杂得多。如果您绑定到Tab Collection (想MVVM),那么选项卡只有在被选中时才会被创建。而对于一个Collection,如果你留下一个标签,然后回来,它会被再次构建。如果在XAML中创建选项卡,则在加载窗口时将构建所有选项卡。是的,您可以为每个选项卡使用不同的DataContext。我对惰性加载所做的是绑定到TabItem属性IsSelected,如果它为false,则类中的所有属性只返回一个(快速)符合静态类型的值。如果将IsSelected更改为true,则加载实际值并调用NotifyPropertyChanged (并保存实际值)。
我使用了它,我加载了一个很大的对象,其中一个标签是摘要。标签页不会虚拟化,但是如果你有很大的列表,那么一定要在标签页中使用虚拟化。您可以使用BackgroundWorker创建属性,但是一旦它返回并绑定了返回值,UI就会锁定,直到呈现UI控件为止。对我来说,重用单个框架而不是选项卡是一个UI问题。为了拆分代码,我通常加载一个带有框架和页面的选项卡(并且我通常将数据传递到ctor中的页面以加载动态内容)。
https://stackoverflow.com/questions/10000092
复制相似问题