2015-09-11 329 views
1

我在我的应用程序中使用Closable TabItems实现了TabControl。为此,我使用了一个集合,它使用MenuItem“Öffne”的SubMenuItem填充,这些子菜单绑定到MainViewModel中的ICommands。WPF Tabcontrol(TabItem内容未显示)

因此,如果我点击MenuItem“打开Tab1”,然后创建标签1的标题,但我看不到任何内容。显示TabItem的内容后,我点击TabItem的标题。但是我希望它在TabItem被“创建”时直接显示,而不需要点击标题。从“X”按钮关闭TabItems可以正常工作。

我看了几个例子,尝试了一个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缺少一个“好的“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

我也花了很多时间,数额巨大,以解决这个问题... ;-)