我无法使用动态填充的DataContextTabItems访问正确的TabControl

使用以下代码,我将ItemsSourceTabControl绑定到ObservableCollection<TabViewModel>上的MainViewModel

根据Type中每个TabViewModelItemSource属性,选择一个不同的UserControl作为ContentTabItem属性。在这里开始出错

这些UserControls需要将其DataContext设置为MainViewModel,但是由于动态TabItems似乎是在不同的可视树中创建的,因此无法访问它。

<TabControl x:Name="mainTabControl" ItemsSource="{Binding TabList}">
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Header" Value="{Binding Name}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Type}" Value="Summary" >
                    <Setter Property="Content">
                        <Setter.Value>
                            <views:AnalysisArisingSummaryControl />
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Type}" Value="User Defined" >
                    <Setter Property="Content">
                        <Setter.Value>
                            <views:AnalysisUserDefinedControl />
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=Type}" Value="System Defined" >
                    <Setter Property="Content">
                        <Setter.Value>
                            <views:AnalysisSystemDefinedControl />
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TabControl.ItemContainerStyle>
</TabControl>


关于如何完成此操作的任何想法。如果我可以帮忙,我真的不想在ViewModels之间引用数据。

最佳答案

您将整个方案都弄错了。更好的解决方案是首先为您的不同视图模型类声明一个基类。然后,每个不同的视图模型都应该扩展该基类。这将使您拥有该基类类型的一个集合,可以将所有不同的视图模型添加到其中。

下一步将是为每种视图模型类型声明一个DataTemplate,以确定应如何显示它们。重要的是,不要在这些x:Key上设置DataTemplate值,这样它们将隐式应用于您的项目。在这种情况下,您将不需要使用Trigger来区分不同的视图模型,并且Framework会根据您声明的DataTemplate自动呈现它们。

<DataTemplate DataType="{x:Type ViewModels:AnalysisArisingViewModel}">
    <Views:AnalysisArisingSummaryControl />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:AnalysisSystemDefinedViewModel}">
    <Views:AnalysisSystemDefinedControl />
</DataTemplate>




更新>>>

为了将数据绑定到父视图模型的属性,可以使用RelativeSource Binding。因此,如果在设置为CollectionMainViewModelDataContext实例中具有名为MainWindow.xaml Window的集合属性,则可以像这样在UserControl内将数据绑定到它:

<DataGrid ItemsSource="{Binding DataContext.Collection, RelativeSource={RelativeSource
    AncestorType={x:Type MainWindow}}}" ... />

08-07 08:02