TabControl不显示选项卡集合

时间:2012-01-19 10:18:37

标签: wpf mvvm viewmodel tabcontrol

我正在尝试构建一个非常简单的基本应用程序,它使用MVVM模式将选项卡项添加到选项卡控件。 所以我创造了: 一个简单的视图,一个按钮 - “CustomerView.xaml”

一个空的ViewModel类 - 它是空的,因为视图没有保存或从Viewmodal中提取任何信息(只有一个按钮) - “CustomerViewModel.cs”

MainWindow类代码包含CustomerViewModel的可观察集合 并有一个“添加客户”按钮 - 将客户标签项添加到tabcontrol和tabcontrol本身。

我不使用命令,因为此时它不相关,我只是在我向集合中添加新的CustomerViewModel时出现的新tabitem。

结果是,虽然我可以看到CustomerViewModel被添加到Observable集合中,但我仍然没有看到tabitems被添加到tabcontrol中 - 该集合没有更新tabcontrol。

这是MainWindow XAML:

<Window x:Class="MyViewModalTabControl.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:vm="clr-namespace:MyViewModalTabControl.ViewModal"
    xmlns:vw="clr-namespace:MyViewModalTabControl.Views"

    Title="MainWindow" Height="350" Width="525">
<Window.Resources>

    <DataTemplate DataType="{x:Type vm:CustomerViewModel}">
        <vw:CustTabView />
    </DataTemplate>

    <DataTemplate x:Key="ClosableTabItemTemplate">
        <DockPanel Width="120">
            <Button 
            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="Sample" 
            VerticalAlignment="Center" 
            />
        </DockPanel>
    </DataTemplate>

</Window.Resources>

<Grid Margin="4" ShowGridLines="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Button Name="CustTabButton" Content="New Customer" Height="30" Margin="12,136,9,136" Click="CustTabButton_Click"></Button>


    <TabControl Grid.Column="1" Grid.Row="0" Background="Red"
                ItemsSource="{Binding CustomerTabs}" 
                ItemTemplate="{StaticResource ClosableTabItemTemplate}"
                >


    </TabControl>
</Grid>

这是MainWindow背后的代码:

 public partial class MainWindow : Window
{
    private ObservableCollection<CustomerViewModel> _customertabs;
    public ObservableCollection<CustomerViewModel> CustomerTabs
    {
        get
        {
            if (_customertabs == null)
            {
                _customertabs = new ObservableCollection<CustomerViewModel>();
               // _workspaces.CollectionChanged += this.OnWorkspacesChanged;
            }
            return _customertabs;
        }
    }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void CustTabButton_Click(object sender, RoutedEventArgs e)
    {

        CustomerViewModel CustomerWorkSpace = new CustomerViewModel();
        this.CustomerTabs.Add(CustomerWorkSpace);

    }


}

这是Viewmodel类:

 public class CustomerViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

}

这是视图:

UserControl x:Class="MyViewModalTabControl.Views.CustTabView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <Button Name="CustTabButton" Content="New Customer" Height="30" Margin="12,136,9,136"></Button>
</Grid>

我缺少什么?

3 个答案:

答案 0 :(得分:2)

你在哪里设置主窗口的datacontext?您的绑定只能使用正确的Datacontext。

并且创建一个mainviewmodel也不是更好,它会处理你现在放在mainwindow.cs中的东西吗?

编辑:请看看乔什史密斯的this msdn帖子。在那里你也可以找到一个可关闭的标签。

答案 1 :(得分:0)

尝试以下任何一种

  • ClosableTabItemTemplate应该“返回”TabItem,它将显示在标签控件中,而不是DockPanel
  • TabItem控件
  • 创建template
  • code
  • 中执行

答案 2 :(得分:0)

这是修复:

public MainWindow()
{
     InitializeComponent();
     this.DataContext=this;   
}