WPF Frame 的 DataContext 不能被 Page 继承

转载至https://blog.csdn.net/sinat_31608641/article/details/88914517

已测试解决方案可行,因为WPF相关资料稀少,防止日后404,特搬运到自己博客

 

 

如果大家有研究 Frame 会发现一个诡异的现象。

假设 page 是在 Frame 里面的 Page ,通过下面的代码是可以拿到 DataContext ,而且假设 Frame 的 DataContext 就是一个定义的类 Foo

  1. var frame = page.Parent as Frame;
  2. // frame.DataContext == foo

但是如果直接拿 page 的 DataContext ,则返回空。

原因是 Frame 是做了 Frame 里面的元素的 UI 隔离,也就是 DataContext 不能继承。

解决的方法是在 Frame 的 LoadCompleted 添加让里面元素知道 DataContext ,需要后台代码

  1. <Frame Name="frame"
  2. LoadCompleted="Frame_LoadCompleted"
  3. 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;
        }

posted on 2020-05-19 13:56  鲁广广  阅读(268)  评论(0编辑  收藏  举报

导航