2

我无法使用动态填充DataContext的.TabItemsTabControl

使用下面的代码,我将 my 绑定到ItemsSourcemy上TabControl的一个.ObservableCollection<TabViewModel>MainViewModel

根据Type中每个的属性,TabViewModel选择ItemSource不同UserControl的作为 的Content属性TabItem正是在这里开始出错

这些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如果我能提供帮助,我真的不想在两者之间引用数据。

4

1 回答 1

1

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

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

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

更新>>>

为了将数据绑定到父视图模型的属性,您可以使用RelativeSource Binding. 因此,如果您有一个在设置为 的实例中命名的集合属性CollectionMainViewModel那么您可以从 s 中将数据绑定到它,DataContext如下所示:MainWindow.xaml WindowUserControl

<DataGrid ItemsSource="{Binding DataContext.Collection, RelativeSource={RelativeSource 
    AncestorType={x:Type MainWindow}}}" ... />
于 2014-06-12T12:21:46.760 回答