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