Wpf 用棱镜在样式内装订

Wpf 用棱镜在样式内装订,wpf,data-binding,prism,Wpf,Data Binding,Prism,我正在研究Prism Github repo中提供的示例代码,我对某一行感到困惑 在: 为什么绑定必须指定DataContext属性?我的理解是,默认情况下,绑定源是元素的DataContext。是因为它的风格吗?这里的绑定源似乎是TabItem,您必须显式访问DataContext属性。绑定与样式的TargetType无关。应用样式后,将根据FrameworkElement的当前DataContext解析绑定路径(除非某些内容更改了源,如显式设置源、RelativeSource或Eleme

我正在研究Prism Github repo中提供的示例代码,我对某一行感到困惑

在:


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

绑定与样式的TargetType无关。应用样式后,将根据FrameworkElement的当前DataContext解析绑定路径(除非某些内容更改了源,如显式设置源、RelativeSource或ElementName)

这里发生的事情是Prism RegionManager使用ViewA/ViewB作为选项卡项的数据上下文。用以下代码确认:

<TabControl prism:RegionManager.RegionName="ContentRegion" Margin="5" 
            SelectionChanged="TabControl_SelectionChanged"/>
ViewA/ViewB是控件,它们有自己的DataContext(对应的视图模型)。TabItem Header绑定到嵌套DataContext中的属性,这就是绑定路径中存在
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
    }
}