我正在使用MVVM模式开发我的应用。MainWindow包括一个TabControl,其中的DataContext与ViewModel进行了映射:
<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="templateMainTabControl">
<ContentPresenter Content="{Binding Path=DisplayName}" />
</DataTemplate>
<local:ViewModel x:Key="VM" />
<local:WorkspaceSelector x:Key="WorkspaceSelector" />
<local:TabOneView x:Key="TabOneView" />
<local:TabTableView x:Key="TabTableView" />
<DataTemplate x:Key="TabOne">
<local:TabOneView />
</DataTemplate>
<DataTemplate x:Key="TabTable">
<local:TabTableView />
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<TabControl Grid.Row="0"
DataContext="{StaticResource VM}"
ItemsSource="{Binding Workspaces}"
SelectedItem="{Binding SelectedWorkspace}"
ItemTemplate="{StaticResource templateMainTabControl}"
ContentTemplateSelector="{StaticResource WorkspaceSelector}" />
WorkspaceSelector
看起来像:
public class WorkspaceSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate( object item, DependencyObject container )
{
Window win = Application.Current.MainWindow;
Workspace w = ( Workspace ) item;
string key = w.DisplayName.Replace( " ", "" );
if ( key != "TabOne" )
{
key = "TabTable";
}
return win.FindResource( key ) as DataTemplate;
}
}
这样,TabOne
将返回 DataTemplate
。TabOne
和其他两个标签将返回 DataTemplate
TabTable
。
如果我运行应用程序并点击每个选项卡两次(1、2、3、1、2、3),我得到的结果与预期不符:
创建 TabOne 视图
创建 TabTwo 视图
创建 TabOne 视图
创建 TabTwo 视图
也就是说,如果 TemplateSelector
返回一个不同的值,则现有选项卡的控件将被丢弃,并创建新选项卡的控件;如果 TemplateSelector
返回相同的值,则什么都不会发生。
这正是我不想要的!我希望 TabControl
保留所有选项卡上的控件,并且我希望能够在从 TabTwo
到 TabThree
的情况下通过代码创建不同的控件。我可以不考虑后者。但是,我该如何告诉 TabControl
在未选择时不要丢弃每个选项卡的控件?