我有一个IList绑定到a的viewmodels TabControl.这IList不会改变整个生命周期TabControl.
<TabControl ItemsSource="{Binding Tabs}" SelectedIndex="0" >
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Content" Value="{Binding}" />
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
每个viewmodel都有一个DataTemplate在a中指定的ResourceDictionary.
<DataTemplate TargetType={x:Type vm:MyViewModel}>
<v:MyView/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
DataTemplate中指定的每个视图都是资源密集型的,足以创建我只想创建每个视图一次,但是当我切换选项卡时,会调用相关视图的构造函数.从我所读到的,这是预期的行为TabControl,但我不清楚调用构造函数的机制是什么.
我已经看过一个使用UserControls 的类似问题,但是那里提供的解决方案需要我绑定到不受欢迎的视图.
我是WPF的初学者,我在编码时需要做很多学习,所以请耐心等待.我搜索了档案,但找不到符合我问题的答案.
我目前有一个包含选项卡控件的视图,该控件最初加载了2个默认选项卡,然后根据用户操作以编程方式添加和删除其他选项卡.
我这样做的方法是为我可以添加和删除的不同类型的视图提供一个可观察的ViewModel集合.
在我的Xaml视图中,我有一些不同的DataTemplate,用于确定要加载的视图类型.
我面临的问题是当我从一个标签点击另一个标签时,我看到一个滞后 - 接近一秒.我在视图后面的代码中加了一个断点,并注意到InitializeComponent()每次单击该选项卡时都会调用该方法.
调用ViewModels的集合ActiveContents,它包含类型的项ActiveContent.ActiveContent该类是我创建的类,它包含一个名为的对象ContentItem,它将保存ViewModel.
以下是我项目中的一些代码:
来自xaml的数据模板之一:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
.
.
.
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
<DataTemplate DataType="{x:Type viewmodels:InstallQueueViewModel}">
<local:InstallQueueView DataContext="{Binding Path=DataContext.InstallQueueVM,
RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
</DataTemplate>
.
.
.
<DataTemplate x:Key="DataTemplateTabControlContent">
<ContentControl Content="{Binding ContentItem}"></ContentControl>
</DataTemplate>
</UserControl.Resources>
<Grid>
<TabControl ItemsSource="{Binding ActiveContents}"
SelectedIndex="{Binding SelectedTab, Mode=TwoWay}"
IsSynchronizedWithCurrentItem="True"
ItemContainerStyle="{DynamicResource TabItemContainerStyleSpacedMedium}"
ItemTemplate="{StaticResource DataTemplateTabControlHeader}"
ContentTemplate="{StaticResource DataTemplateTabControlContent}">
</TabControl>
Run Code Online (Sandbox Code Playgroud)
有没有办法阻止它每次都加载一个新的视图实例?就像我说的,这是我的第一次,所以我完全有可能以错误的方式解决这个问题 - 如果我要改变我的做法,请告诉我.
我想我应该提到的一件事是,我正在使用MahApps来获得应用程序的Metro感觉.我不确定这对我所看到的滞后是否有贡献.
我主要在切换到包含a的视图时看到滞后DataGrid.我正在考虑将其更改为a,ListView因为数据是只读的,我希望这会给我一些改进,但根本原因仍然没有得到解决.
任何帮助将不胜感激.