Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TabControl WPF MVVM中的延迟加载(再次)_C#_Wpf_Mvvm_Tabs_Lazy Loading - Fatal编程技术网

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>