C# TabControl WPF MVVM中的延迟加载(再次)
我知道,这已经是很多了,非常直截了当 这是C# TabControl WPF MVVM中的延迟加载(再次),c#,wpf,mvvm,tabs,lazy-loading,C#,Wpf,Mvvm,Tabs,Lazy Loading,我知道,这已经是很多了,非常直截了当 这是TabControl的ItemsSource: Tabs = new ObservableCollection<aTabViewModel> { new HomeViewModel(), new StatisticsViewModel() }; HomeViewModel和StatisticsViewModel在我们第一次将它们添加到Tabs集合时实例化,第二次在应用程序中选择tab时实例化(这似乎是TabControl的
TabControl
的ItemsSource
:
Tabs = new ObservableCollection<aTabViewModel>
{
new HomeViewModel(),
new StatisticsViewModel()
};
HomeViewModel
和StatisticsViewModel
在我们第一次将它们添加到Tabs
集合时实例化,第二次在应用程序中选择tab时实例化(这似乎是TabControl
的一种行为)。这种双重装载显然是不对的
Q:如何使选项卡仅在选中时加载
如何使选项卡仅在选中时加载
在选项卡页面上的事件中放入此类加载逻辑,并进行检查,以验证
DataContext
仅加载一次 我不认为VM被实例化了不止一次。让TabControl列表的ItemsSource保存选项卡标题,在ViewModel中添加string属性保存所选选项卡,在SelectedTab的Setter中,检查新选择并创建其DataContext(如果Tab已加载),因此只需分配它即可。您肯定会对视图模型和视图感到困惑,因为无法通过Tab控件在此处所做的任何操作来创建VM。@StanleyRussian他是对的,TabControls本身并不会这样做。也就是说,一种解决方案是在创建viewmodels时不让viewmodels加载任何数据。相反,他们实现了一个接口ILazyLoad,该接口有一个LazyLoad()方法,如果vm的东西还没有加载,该方法将加载它。然后在TabControl_SelectionChanged中的codebehind中,获取新选项卡的DataContext,如果它实现了ILazyLoad、cast和call。。
<TabControl ItemsSource="{Binding Tabs}">
<TabControl.Resources>
<DataTemplate DataType="{x:Type pagesVM:HomeViewModel}">
<pages:Home/>
</DataTemplate>
<DataTemplate DataType="{x:Type pagesVM:StatisticsViewModel}">
<pages:Statistics/>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemContainerStyle>
<Style BasedOn="{StaticResource MetroTabItem}" TargetType="TabItem">
<Setter Property="Header" Value="{Binding Header}" />
</Style>
</TabControl.ItemContainerStyle>