我无法使用动态填充的DataContext
为TabItems
访问正确的TabControl
。
使用以下代码,我将ItemsSource
的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
之间引用数据。 最佳答案
您将整个方案都弄错了。更好的解决方案是首先为您的不同视图模型类声明一个基类。然后,每个不同的视图模型都应该扩展该基类。这将使您拥有该基类类型的一个集合,可以将所有不同的视图模型添加到其中。
下一步将是为每种视图模型类型声明一个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
。因此,如果在设置为Collection
的MainViewModel
的DataContext
实例中具有名为MainWindow.xaml Window
的集合属性,则可以像这样在UserControl
内将数据绑定到它:<DataGrid ItemsSource="{Binding DataContext.Collection, RelativeSource={RelativeSource
AncestorType={x:Type MainWindow}}}" ... />