Я использую шаблон 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's View создан
Создан вид TabTwo
, то есть, если TemplateSelector
возвращает другое значение, элементы управления существующей вкладки отбрасываются и создаются элементы управления новой вкладки, а если TemplateSelector
возвращает то же значение, ничего не происходит.
Это именно то, чего я не хочу! Я бы хотел, чтобы TabControl
оставил все элементы управления на вкладках, и я хотел бы иметь возможность что-то сделать с созданием различных элементов управления в коде для случая, когда я перехожу с TabTwo
на TabThree
. Я могу жить без последнего. Но как я могу сказать TabControl
не выбрасывать элементы управления каждой вкладки, когда она не выбрана?