C# WPF在TabControl的DataTemplate中绑定不同的UserControl

C# WPF在TabControl的DataTemplate中绑定不同的UserControl,c#,wpf,xaml,mvvm,mvvm-light,C#,Wpf,Xaml,Mvvm,Mvvm Light,作为WPF和MVVM领域的新手,我正在努力将MVVM模式应用到TabControl中。我将给你一个我正在努力实现的例子 TabOne-xaml及其视图模型 <UserControl x:Class="TestTabControl.TabOne" xmlns:local="clr-namespace:TestTabControl" mc:Ignorable="d" d:DesignHeight="300" d:D

作为WPF和MVVM领域的新手,我正在努力将MVVM模式应用到TabControl中。我将给你一个我正在努力实现的例子

TabOne-xaml及其视图模型

<UserControl x:Class="TestTabControl.TabOne"
             xmlns:local="clr-namespace:TestTabControl"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBlock Text="tab one ..." FontWeight="Bold" FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</UserControl>

//TabOne ViewModel
class TabOne : ViewModelBase
{
    public string TabName
    {
        get
        {
            return "TabOne";
        }
    }
}

//TabOne视图模型
类TabOne:ViewModelBase
{
公共字符串选项卡名
{
得到
{
返回“TabOne”;
}
}
}
TabTwo-xaml及其viewmodel

<UserControl x:Class="TestTabControl.TabTwo"
             xmlns:local="clr-namespace:TestTabControl"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBlock Text="tab two ..." FontWeight="Bold" FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</UserControl>

//TabTwo ViewModel
class TabTwo : ViewModelBase
{
    public string TabName
    {
        get
        {
            return "TabTwo";
        }
    }
}
<Window x:Class="TestTabControl.MainWindow"
        xmlns:local="clr-namespace:TestTabControl"
        mc:Ignorable="d"
        Title="Test Tab Control" MinWidth="500" Width="1000" Height="800">
    <TabControl ItemsSource="{Binding TabViewModels}" >
        <TabControl.ItemTemplate >
            <!-- header template -->
            <DataTemplate>
                <TextBlock Text="{Binding TabName}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                ?????????
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
</Window>


//MainWindow ViewModel 
class MainWindowViewModel : ViewModelBase
{
    private ObservableCollection<ViewModelBase> _tabViewModels;

    public MainWindowViewModel()
    {
        _tabViewModels = new ObservableCollection<ViewModelBase>();
        TabViewModels.Add(new TabOne());
        TabViewModels.Add(new TabTwo());
    }

    public ObservableCollection<ViewModelBase> TabViewModels
    {
        get
        {
            return _tabViewModels;
        }
        set  // is that part right?
        {
            _tabViewModels = value;
            RaisePropertyChanged(() => TabViewModels);
        }
    }
}

//TabTwo视图模型
类选项卡二:ViewModelBase
{
公共字符串选项卡名
{
得到
{
返回“TabTwo”;
}
}
}
最后是主窗口xaml及其viewmodel

<UserControl x:Class="TestTabControl.TabTwo"
             xmlns:local="clr-namespace:TestTabControl"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBlock Text="tab two ..." FontWeight="Bold" FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</UserControl>

//TabTwo ViewModel
class TabTwo : ViewModelBase
{
    public string TabName
    {
        get
        {
            return "TabTwo";
        }
    }
}
<Window x:Class="TestTabControl.MainWindow"
        xmlns:local="clr-namespace:TestTabControl"
        mc:Ignorable="d"
        Title="Test Tab Control" MinWidth="500" Width="1000" Height="800">
    <TabControl ItemsSource="{Binding TabViewModels}" >
        <TabControl.ItemTemplate >
            <!-- header template -->
            <DataTemplate>
                <TextBlock Text="{Binding TabName}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                ?????????
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
</Window>


//MainWindow ViewModel 
class MainWindowViewModel : ViewModelBase
{
    private ObservableCollection<ViewModelBase> _tabViewModels;

    public MainWindowViewModel()
    {
        _tabViewModels = new ObservableCollection<ViewModelBase>();
        TabViewModels.Add(new TabOne());
        TabViewModels.Add(new TabTwo());
    }

    public ObservableCollection<ViewModelBase> TabViewModels
    {
        get
        {
            return _tabViewModels;
        }
        set  // is that part right?
        {
            _tabViewModels = value;
            RaisePropertyChanged(() => TabViewModels);
        }
    }
}

?????????
//主窗口视图模型
类MainWindowViewModel:ViewModelBase
{
私有可观察收集(tabViewModels);
公共主窗口视图模型()
{
_tabViewModels=新的ObservableCollection();
TabViewModels.Add(新TabOne());
TabViewModels.Add(新tabtwoo());
}
公共可观测集合选项卡视图模型
{
得到
{
返回选项卡视图模型;
}
那部分对吗?
{
_tabViewModels=值;
RaisePropertyChanged(()=>TabViewModels);
}
}
}

我应该在数据模板中写什么?我是否可以在此DataTemplate中传递TabOne和TabTwo的usercontrols,以便获得我单击的每个选项卡的视图?或者我需要编写另一个数据模板吗?

您现在可能已经知道答案了。但为了他人的利益,你需要做的是:



可能与@AlexPaven重复,但无法解决我的问题。这不是同一个问题。。。我改变了我的问题。我提到的问题提供了足够的细节,但好吧,也许我不明白到底是什么问题。你到底想完成什么?应该是选项卡控件内容的属性是什么?如果每个选项卡viewmodel上都有其他属性,则可以将其绑定为内容。当我运行应用程序时,选项卡标题会正确更新。但是我也不知道如何更新标签的内容。如何绑定选项卡内容中每个usercontrol的xaml?请参见此属性?可以将数据模板与类型关联。当内容控件(如TabControl)绑定到对象(本例中为ItemsSource的内容)时,它会查找与对象类型匹配的DataTemplate。因此,为了简化操作,每个选项卡页都应该绑定到不同类型的对象(根据需要),每个对应的UserControl应该放在一个数据模板(…)中,并用适当的{x:type…}标记