WPF Frame 的 DataContext 不能被 Page 继承
转载至https://blog.csdn.net/sinat_31608641/article/details/88914517
已测试解决方案可行,因为WPF相关资料稀少,防止日后404,特搬运到自己博客
如果大家有研究 Frame 会发现一个诡异的现象。
假设 page 是在 Frame 里面的 Page ,通过下面的代码是可以拿到 DataContext ,而且假设 Frame 的 DataContext 就是一个定义的类 Foo
-
var frame = page.Parent as Frame;
-
// frame.DataContext == foo
但是如果直接拿 page 的 DataContext ,则返回空。
原因是 Frame 是做了 Frame 里面的元素的 UI 隔离,也就是 DataContext 不能继承。
解决的方法是在 Frame 的 LoadCompleted 添加让里面元素知道 DataContext ,需要后台代码
-
<Frame Name="frame"
-
LoadCompleted="Frame_LoadCompleted"
-
DataContextChanged="Frame_DataContextChanged"/>
后台代码
private void Frame_LoadCompleted(object sender , NavigationEventArgs e)
{
UpdateFrameDataContext();
}
private void Frame_DataContextChanged(object sender , DependencyPropertyChangedEventArgs e)
{
UpdateFrameDataContext();
}
/// <summary>
/// Frame 的 DataContext 不能被 Page 继承,需要做进一步的处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void UpdateFrameDataContext()
{
var content = this.frame.Content as FrameworkElement;
if (content == null)
{
return;
}
content.DataContext = this.frame
.DataContext;
}