page.DataContext不是从父Frame继承的?

Mar*_*rth 20 c# wpf datacontext msdn binding

我有一个page框架中的页面frame,有frame.DataContext = "foo".

  • (page.Parent as Frame).DataContext"foo".
  • BindingExpression for page.DataContextis null(也强制使用ClearValue).
  • page.DataContextnull.但我期待"foo"!

为什么DataContext没有继承?据我所知,Frame 沙箱的内容.但是我找不到任何关于这种行为的文件 - 有人能指出我提到这个的地方吗?

Joe*_*ite 29

你没有具体询问如何使这项工作,只是为什么它没有默认.但是,如果您确实希望Pages继承Frame的DataContext,则可以执行以下操作:

在XAML中:

<Frame Name="frame"
       LoadCompleted="frame_LoadCompleted"
       DataContextChanged="frame_DataContextChanged"/>
Run Code Online (Sandbox Code Playgroud)

在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;
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*ite 18

要回答有关此行为文档的问题:这不是Microsoft文档,但我有几本WPF书籍都提到了这一点.

" 基本的Windows Presentation Foundation "说:(第160-161页)

托管可导航内容有两个有趣的模型:独立托管和集成托管.

使用隔离托管,内容不受信任,并且在完全隔离(沙盒)环境中运行.这是在系统Web浏览器中作为XAML浏览器应用程序运行时托管WPF内容的方式.对于导航到其他应用程序或HTML内容,此Frame对象支持此独立主机模型.

我们希望内容在我们的应用程序中运行的集成托管在系统中根本不受支持.当Frame导航到应用程序内的内容时,我们得到了孤立和集成行为的奇怪混合.Frame将其内容与其样式(及其父级样式)隔离开来,而不是从应用程序的样式中隔离出来.事件不会从内容中冒出来Frame; 但是,可以从Content属性访问对象(这意味着它们在安全意义上不是孤立的).

出于所有这些原因,Frame在我们处理外部内容时最有用,但它可以小心地用于应用程序内容.

这就是它所要说的 - 没有关于财产继承的事.

" Windows Presentation Foundation Unleashed说(第95页):

Frame控制持有任意内容,就像所有其他内容的控制,但它隔离开UI的其余部分的内容.例如,通常在元素树下继承的属性在到达时停止Frame.