【问题标题】:Can you use data binding with the Content property of a WPF Frame?您可以将数据绑定与 WPF 框架的 Content 属性一起使用吗?
【发布时间】:2011-02-11 15:34:27
【问题描述】:

我可以使用数据绑定来设置 WPF 框架的初始内容,但是对绑定属性的后续更改(使用 INotifyPropertyChange 实现)似乎不会更改内容。

另外,有谁知道以这种方式直接绑定到 Content 属性是否会导致绑定的项目出现在 Frame 或 NavigationWindow 的日志中?

一些上下文:我意识到我可能应该使用 NavigationService 与 Frame 进行交互,但我正在尝试遵循 MVVM 模式。将数据绑定到 Content 属性似乎要简单得多...

【问题讨论】:

    标签: wpf mvvm navigation frame


    【解决方案1】:

    您可以对 Frame 使用数据绑定,但您需要确保将 Binding 的 Mode 设置为 TwoWay。

    XAML:

    <Frame Content={Binding Path=MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} />
    

    查看模型:

    public class MyViewModel : INotifyPropertyChanging, INotifyPropertyChanged
    {
      public Page MyProperty
      {
        get
        {
          return _viewModelPage;
        }
    
        set
        {
          this.OnPropertyChanging("MyProperty");
          _viewModelPage = value;
          this.OnPropertyChanged("MyProperty");
        }
      }
    }
    

    【讨论】:

    • 由于某种原因,这不会更新框架 - 我是从窗口包含框架的窗口视图模型中进行的
    【解决方案2】:

    WPF 社区中的许多人都同意内置导航框架已损坏。但是,即使您要使用它,绑定 Content 属性也不是正确的方法。如果你想将 MVVM 与导航结合使用,你应该将它与 FrontController 模式结合起来,在这种模式中,ViewModel 将导航请求分派给控制器,然后控制器会为你解析该请求。这个概念的例子并不多,因为(正如我之前提到的)许多开发人员都使用 WPF 的内置导航。

    如果你想看一个非常强大的 WPF 导航引擎,look at nRoute 它是 MVC 路由引擎到 WPF 的一个端口。

    【讨论】:

      【解决方案3】:

      Frame是一个导航宿主,所以使用NavigationService导航到不同的内容更正确。如果您使用 INotifyPropertyChange,我想您会在内容更改时调用相关事件。那么,我也假设用NavigationService代替也没什么难的。

      【讨论】:

        【解决方案4】:

        几天前我遇到了这个问题。我有一个带框架的主窗口,我将不同的页面加载到框架中(使用Navigate())。页面的数据绑定被破坏,数据没有显示在加载的页面上。

        要修复绑定,请创建现有的DataContext 或将其提供给框架内的页面,绑定将再次起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-09
          • 1970-01-01
          • 1970-01-01
          • 2013-10-21
          • 2013-10-16
          • 2018-05-10
          • 2017-11-08
          • 1970-01-01
          相关资源
          最近更新 更多