page.DataContext不是从父Frameinheritance的?
我在Frame frame
有一个页面page
,其中frame.DataContext = "foo"
。
-
(page.Parent as Frame).DataContext
是"foo"
。 好 -
page.DataContext
BindingExpression为null
(也强制使用ClearValue)。 好 -
page.DataContext
为null
。 但我期待“foo”!
为什么DataContext没有inheritance? 据我所知 ,Frame 沙箱的内容。 但我找不到任何关于这种行为的文件 – 有人能指出我提到这个的地方吗?
要回答有关此行为文档的问题:这不是Microsoft文档,但我有几本WPF书籍都提到了这一点。
“ Essential Windows Presentation Foundation ”说:(第160-161页)
托管可导航内容有两个有趣的模型:独立托管和集成托管。
使用隔离托管 ,内容不受信任,并且在完全隔离(沙盒)环境中运行。 这是在系统Web浏览器中作为XAML浏览器应用程序运行时托管WPF内容的方式。 对于导航到其他应用程序或HTML内容,
Frame
对象支持此独立主机模型。我们希望内容在我们的应用程序中运行的集成主机在系统中根本不受支持。 当
Frame
导航到应用程序中的内容时,我们会得到孤立和集成行为的奇怪混合。Frame
将其内容与其样式(及其父级样式)隔离开来,但不是从应用程序的样式中隔离出来。 事件不会从Frame
的内容冒泡; 但是,可以从Content
属性访问对象(这意味着它们在安全意义上不是隔离的)。出于所有这些原因,
Frame
在我们处理外部内容时最有用,但它可以小心地用于应用程序内容。
这就是它所要说的 – 没有关于财产inheritance的事。
“ Windows Presentation Foundation Unleashed说(第95页):
Frame
控件保存任意内容,就像所有其他内容控件一样,但它将内容与UI的其余部分隔离开来。 例如,通常在元素树下inheritance的属性在到达Frame
时停止。
你没有具体询问如何使这项工作,只是为什么它没有默认。 但是,如果您确实希望PagesinheritanceFrame的DataContext,则可以执行以下操作:
在XAML中:
在codebehind中:
private void frame_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) { UpdateFrameDataContext(sender, e); } private void frame_LoadCompleted(object sender, NavigationEventArgs e) { UpdateFrameDataContext(sender, e); } private void UpdateFrameDataContext(object sender, NavigationEventArgs e) { var content = frame.Content as FrameworkElement; if (content == null) return; content.DataContext = frame.DataContext; }
为了建立@ Joe-White的答案,为那些想知道如何使Frame
级联DataContext
,我会提到这也只能在XAML中执行。
对于那些刚接触WPF的人,可以将此XAML放在App.xaml
文件中,以便它覆盖应用程序中拾取默认样式的所有Frame
控件。 这意味着每次使用新Frame
时都不必编写特定的代码隐藏。
我使用VisualStudio 2015可视设计器(见下图)创建上面的大量XAML,然后添加DataContext="{TemplateBinding DataContext}"
来执行级联。