在具有各种 ViewModel 的 TabControl 中重用 UserControl

Reuse UserControl in TabControl with Various ViewModels

我有一个用户控件,我想将其与多个 ViewModel 重用,所有这些 ViewModel 都实现相同的界面。我想将这些嵌入到 TabControl 中。

目前我可以为单个实例执行此操作,但我正在努力重用我的 UserControl。对于单个实例,我可以在 UserContol 的 xaml 中绑定 ViewModel 或在后面的代码中实例化它,但是我不知道如何从更高级别设置它。

这是我的,

      <TabControl HorizontalAlignment="Left" Height="800" Margin="0,0,0,0" VerticalAlignment="Top" Width="600">
        <TabItem Header="Tab1">
            <Frame Source="SomeUserControl.xaml"  BorderThickness="0" Margin="0" />
        </TabItem>
    </TabControl>

这是我想要实现的伪代码,

      <TabControl>
        <TabItem Header="Tab1">
            <Frame Source="{SomeUserControl.xaml, DataContext=ViewModel1}" />
        </TabItem>
        <TabItem Header="Tab2">
            <Frame Source="{SomeUserControl.xaml, DataContext=ViewModel2}" />
        </TabItem>
    </TabControl>

谢谢!

不要对选项卡进行硬编码,而是绑定到 "item" class 的 ObservableCollection。 IE。像

class MyTabItems : INotifyPropertyChanged
{
  public string Header...
  public object DataContext...
}

创建一个:

ObservableCollection<MyTabItems>

将 TabControl ItemsSource 绑定到 ObservableCollection。在 TabControl 的项目模板中,将 Header 绑定到 Header 属性 并将 DataContext 绑定到 DataContext 属性。源代码可以在模板中进行硬编码,或者您可以将另一个 属性 添加到您的项目 class 并将其绑定到该项目,如果您想要更大的灵活性。

多亏了 SledgeHammer 的回答,我才能够采用不同的方法并让事情正常进行。

        <TabControl Name="TabControl" ItemsSource="{Binding TabItems}" HorizontalAlignment="Left" Height="800" Margin="0,0,0,0" VerticalAlignment="Top" Width="600">
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Header}"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <UserControl Content="{Binding DataContext}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>

TabItems 已填充在与上述 xaml 相关的代码中。

    this.TabItems = new ObservableCollection<TabItem>
    {
        new TabItem("Main", new MainControl()), 
        new TabItem("Tab1", new GenericTabControl(new ViewModel1())),
        new TabItem("Tab2", new GenericTabControl(new ViewModel2()))
    };