使用 Prism 在样式内绑定

Binding Inside a Style with Prism

我正在研究 Prism Github 存储库中提供的示例代码,但我对特定行感到困惑。

MainWindow.Xaml#L10中:

<Style TargetType="TabItem">
   <Setter Property="Header" Value="{Binding DataContext.Title}" />
</Style>

为什么Binding要指定DataContext 属性?我的理解是默认情况下绑定源是元素的 DataContext 。是因为它在风格上吗?此处的绑定源似乎是 TabItem,您必须显式访问 DataContext 属性。

绑定 不是 相对于样式的 TargetType。绑定路径在应用 Style 后针对 FrameworkElement 的当前 DataContext 进行解析(除非某些内容更改了 Source,例如显式设置 Source、RelativeSource 或 ElementName)。

这里发生了什么 Prism RegionManager 使用 ViewA/ViewB 作为 TabItem 的 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 Header 绑定到嵌套 DataContext 中的 属性,这就是绑定路径

中存在 DataContext 的原因