我正在阅读Prism Github存储库中提供的示例代码,我对特定的行感到困惑。
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding DataContext.Title}" />
</Style>
为什么绑定必须指定DataContext
属性?我的理解是,绑定源默认是元素的DataContext
。是因为风格吗?似乎这里的绑定源是TabItem
,您必须显式访问DataContext属性。
绑定是not。应用样式后,将根据FrameworkElement的当前DataContext解析绑定路径(除非更改了Source,例如显式设置Source,RelativeSource或ElementName)。
这里发生的事情是Prism RegionManager使用ViewA / ViewB作为TabItems的DataContext。使用以下代码进行确认:
<TabControl prism:RegionManager.RegionName="ContentRegion" Margin="5"
SelectionChanged="TabControl_SelectionChanged"/>
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var tabControl = (TabControl)sender;
var idx = tabControl.SelectedIndex;
if (idx >= 0)
{
var item = tabControl.ItemContainerGenerator.ContainerFromIndex(idx) as TabItem;
var dc = item.DataContext; // ViewA or ViewB
}
}
ViewA / ViewB是控件,并且具有自己的DataContext(对应的视图模型)。 TabItem标头绑定到嵌套DataContexts中的属性,这就是DataContext
存在于绑定路径中的原因