将单个视图模型分配给嵌套视图?

时间:2012-04-25 14:57:13

标签: c#-4.0 mvvm-light datacontext wpf-4.0

我有一个MainView,它在我的WPF应用程序中有一个关联的MainViewModel,通过它的构造函数分配。

  

App> 启动uri > MainWindow.xaml

    public MainWindow()
    {
        InitializeComponent();

        var viewModel = new MainViewModel();

        DataContext = viewModel;
    }

我的MainView可以根据在MainView上单击的按钮隐藏和显示多达四个嵌套视图或子视图。因此,我们切换可见性属性vi一个绑定,通过分配给MainView上每个按钮的命令绑定进行更新。

每个嵌套视图都没有关联的ViewModel,在子视图上找到的所有绑定都会在MainViewModel中找到它们的信息。因此,绑定系统会结束应用程序的UI树,以找出父“MainView”具有关联的ViewModel。

总的来说,有'ONE' - >视图模型。这似乎工作正常,但正如预期的那样,这个VM已经变得很大,需要重新分解。它保存的信息在上下文中不应该。但这是一个证明概念应用程序。所以我决定保持简单并确保它是可行的。

问题:

当我尝试使用空视图模型分配空视图时,我注意到输出窗口中的绑定错误以及预期的奇怪和破坏的行为。这没有任何意义......是否有更简洁明了的方式让WPF知道如何处理它在嵌套视图控件中找到的任何绑定?我想如果每个视图的构造函数都为自己分配了一个如上所示的相应VM,那么它应该工作,因为这在逻辑上是有意义的。不幸的是,当指定要打开的相应视图并隐藏其他按钮时,MainView上的所有按钮都停止工作,并且具有关联的ViewModel。在某些按钮上它可以工作而其他按钮却没有?这真的很奇怪吗?

1 个答案:

答案 0 :(得分:0)

正如我在上面的回答中提到的,问题是WPF绑定系统在运行时努力解决绑定问题。主视图通过Main View构造器实例化并分配了相关的视图模型,并且对MainView所包含的所有嵌套视图重复此模式。

默认情况下,我倾向于使用隐含的绑定语法,这意味着如果没有明确指定源,绑定系统将尝试解析您在绑定中提供的名称。所以这一切都是隐含的,没有明确的设定!

升级每个嵌套视图以拥有自己的视图模型使得这个绑定的自动发现/解析变得有点疯狂,我没有明确告诉绑定系统在哪里找到我正在寻找的属性因此输出窗口绑定错误。

这会导致意外的行为,因为输出窗口告诉它正在尝试解析嵌套视图中的绑定表达式 - >的ViewModels。实际上,它正在查看VM,IS EMPTY!

如果没有在绑定语法中明确设置source属性,那么绑定系统就很清楚了。很聪明,可以自己找东西。在我的情况下,它需要一些额外的帮助,因为它不确定在哪里找到东西。

<强> SOLUTION:

  1. 在MainView构造函数中删除MainViewModel的构造函数声明。
  2. ViewModel的xmlns中的范围可以进入MainView.xaml
  3. 在MainView .xaml
  4. 中创建一个窗口资源
  5. 为资源提供密钥。
  6. 升级MainView xaml文件中的所有绑定以包含source属性。
  7. 为source属性提供一个静态资源绑定,指向在步骤4中设置的ViewModel键值。
  8. 仅针对引用与MainView关联的ViewModel的绑定执行第6步。
  9. 所有嵌套视图都应该保留,他们应该在自己的xaml文件中处理自己的绑定。 MainView只是实例化它们并将它们放在UI上。对我来说就是这种情况,我对嵌套视图没有任何更多的约束。生活在MainView.xaml文件中的所有绑定都引用MainViewModel.cs中的数据。这使您在查看问题时更容易。
  10. 由于某些原因,编辑器很尴尬所以我选择省略任何示例代码,但上面的步骤足以描述我按照我采取的步骤。以上是对我有用的。

    总结这个问题的另一种方式

    • 大多数书籍教授较短的绑定语法
    • 当有多个数据上下文可用时会发生什么?
    • 绑定系统如何知道如何解决短手绑定表达式。