2015-09-11 5 views
1

Я реализовал TabControl с закрывающимися TabItems в своем приложении. Для этого я использую коллекцию, которую я заполняю SubMenuItems MenuItem «Öffne», которые привязаны к ICommands в MainViewModel.WPF Tabcontrol (TabItem Содержимое не отображается)

Так что если я нажму на MenuItem «Открыть вкладку 1», тогда заголовок Tab 1 будет создан, но я не вижу никакого контента. Содержимое TabItem отображается ПОСЛЕ того, как я нажимаю заголовок TabItem. Но я хочу, чтобы он отображался непосредственно, когда TabItem «создан» без необходимости нажатия на заголовок. Закрытие TabItems с кнопки «X» отлично работает.

Я рассмотрел несколько примеров и попробовал ContentTemplate, но это не сработало (возможно, я сделал что-то не так?).

Надеюсь, вы можете сказать мне, что я сделал неправильно или показать мне хороший пример. Спасибо заранее!

Вот мои фрагменты кода:

MainWindow.xaml:

<Window.Resources> 
<vm:MainViewModel x:Key="viewModel"/> 
</Window.Resources> 
<TabControl Background="#FFE5E5E5" ItemsSource="{Binding TabControlViews}" SelectedItem="{Binding CurrentTabItem}" Margin="0,21,0,0"> 
     <TabControl.ItemTemplate> 
      <DataTemplate>  
       <DockPanel Width="120"> 
        <TextBlock Text="{Binding Header}"/> 
        <Button 
       Command="{Binding ParameterizedCommand, Source={StaticResource viewModel}}" 
       CommandParameter="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" 
       Content="X" 
       Cursor="Hand" 
       DockPanel.Dock="Right" 
       Focusable="False" 
       FontFamily="Courier" 
       FontSize="9" 
       FontWeight="Bold" 
       Margin="0,1,0,0" 
       Padding="0" 
       VerticalContentAlignment="Bottom" 
       Width="16" Height="16" /> 
        <ContentPresenter 
       Content="{Binding Path=DisplayName}" 
       VerticalAlignment="Center" /> 
       </DockPanel> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <!--<TabControl.ContentTemplate> 
      <DataTemplate>     
      </DataTemplate> 
     </TabControl.ContentTemplate>--> 
     <TabControl.Resources> 
      <DataTemplate x:Name="test" DataType="{x:Type vm:MenueVM}"> 
       <cu:MenueSearch/> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type vm:FieldPointsVM}"> 
       <cu:FieldPointsSearch/> 
      </DataTemplate> 
      <DataTemplate DataType="{x:Type vm:DataTransferVM}"> 
       <cu:DataTransfer/> 
      </DataTemplate> 
     </TabControl.Resources> 
</TabControl> 

MainWindow.cs:

public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     InitializeComponent(); 
     var vm = (MainViewModel)Resources["viewModel"]; 
     this.DataContext = vm; 
    } 
} 

MainViewModel.cs:

public MainViewModel() 
    { 

     TabControlViews = new ObservableCollection<BaseViewModel>(); 
     _menueVM = new MenueVM("Menüpunkte", "Menue"); 
     _fieldVM = new FieldPointsVM("Feldpunkte", "FieldPoint"); 
     _dataVM = new DataTransferVM("DatenTransfer", "DataTransfer"); 
     ParameterizedCommand = new RelayCommand(DoParameterizedCommand); 
    } 

    private void DoParameterizedCommand(object parameter) 
    { 
     if (parameter.ToString() == "App.ViewModel.MenueVM") 
     { 
      TabControlViews.Remove(_menueVM); 
     } 
     else if (parameter.ToString() == "App.ViewModel.FieldPointsVM") 
     { 
      TabControlViews.Remove(_fieldVM); 
     } 
     else if (parameter.ToString() == "App.ViewModel.DataTransfer") 
     { 
      TabControlViews.Remove(_dataVM); 
     } 
    } 

    private ICommand _parameterizedCommand; 
    public ICommand ParameterizedCommand 
    { 
     get 
     { 
      return _parameterizedCommand; 
     } 
     set 
     { 
      _parameterizedCommand = value; 
     } 
    } 

    private TabItem _propCurrentTabItem; 
    public TabItem CurrentTabItem 
    { 
     get 
     { 
      return _propCurrentTabItem; 
     } 
     set 
     { 
      _propCurrentTabItem = value; 
     } 
    } 

    private ObservableCollection<BaseViewModel> _TabControlViews = new ObservableCollection<BaseViewModel>(); 
    public ObservableCollection<BaseViewModel> TabControlViews 
    { 
     get 
     { 
      return _TabControlViews; 
     } 
     set 
     { 
      _TabControlViews = value; 
      OnPropertyChanged(); 
     } 
    } 

    public ICommand OpenMenupunkteCommand 
    { 
     get 
     { 
      return new BaseCommand(OpenMenuPunkte); 
     } 
    } 

    public ICommand OpenFeldpunkteCommand 
    { 
     get 
     { 
      return new BaseCommand(OpenFeldpunkte); 
     } 
    } 

    public ICommand OpenDataTransferCommand 
    { 
     get 
     { 
      return new BaseCommand(OpenDataTransfer); 
     } 
    } 
    private void OpenMenuPunkte() 
    { 
     if (!TabControlViews.Contains(_menueVM)) 
     { 
      TabControlViews.Add(_menueVM); 
     } 

    } 

    private void OpenFeldpunkte() 
    { 
     if (!TabControlViews.Contains(_fieldVM)) 
     { 
      TabControlViews.Add(_fieldVM); 
     } 
    } 

    private void OpenDataTransfer() 
    { 
     if (!TabControlViews.Contains(_dataVM)) 
     { 
      TabControlViews.Add(_dataVM); 
     } 
    } 

MenueVM.cs

public class MenueVM : BaseViewModel 
{ 

    public MenueVM() 
    { 
     //Here are some actions done for Data, but I think they are unimportant for this question 
    } 

    public MenueVM(string header, string content) 
    { 
     Header = header; 
     Content = content; 
    } 

    private string _header; 
    public string Header 
    { 
     get 
     { 
      return _header; 
     } 
     set 
     { 
      _header = value; 
     } 
    } 
+1

Возможно, TabControl отсутствует " good "SelectedIndex после добавления TabItem. я бы угадал его -1, поэтому вам нужно нажать TabItem. – blindmeis

+0

Я уже пробовал это. Здесь проблема в том, что когда я пытаюсь удалить TabItem, я не могу правильно установить SelectedItem. Я хочу иметь возможность закрыть элементы, которые не выбраны. – Yasemin

ответ

1

Еще не опубликовано ответ? Попробуйте это:

XAML:

<TabControl ItemsSource="{Binding....}" IsSynchronizedWithCurrentItem="True"> 
    <!-- style, template, ... --> 
</TabControl> 

CS:

//Adding your viewModel to your ObservableCollection<> TabControlViews 
TabControlViews.Add(_viewModelToAdd); 
ICollectionView collectionView = CollectionViewSource.GetDefaultView(TabControlViews); 
if (collectionView != null) 
{ 
    collectionView.MoveCurrentTo(_viewModelToAdd); 
    //And this is because you don't want your tabItem to be selected : 
    collectionView.MoveCurrentToPrevious(); 
} 

Найдено в загружаемом DemoMVVMApp здесь: https://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030

Я также провел огромное количество времени, чтобы решить эта проблема ... ;-)

Смежные вопросы