用棱镜绑定样式内部

问题描述 投票:2回答:1

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

MainWindow.Xaml#L10中:

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

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

wpf data-binding prism
1个回答
0
投票
相对于样式的TargetType,

绑定是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存在于绑定路径中的原因

© www.soinside.com 2019 - 2024. All rights reserved.