2012-04-25 84 views
0

我有一个MainView,它在我的WPF应用程序中有一个关联的MainViewModel,通过它的构造器进行赋值。将单个视图模型分配给嵌套视图?

应用>启动URI> MainWindow.xaml

public MainWindow() 
    { 
     InitializeComponent(); 

     var viewModel = new MainViewModel(); 

     DataContext = viewModel; 
    } 

我的MainView拥有多达四个嵌套观点或谁是隐藏和显示基于已按钮子视图点击MainView。因此,我们切换可见性属性vi通过分配给MainView上每个按钮的命令绑定更新的绑定。

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

所以整体上有'ONE' - > ViewModel。这似乎工作得很好,但正如预期的那样,虚拟机已经变得很大,需要重新分解。它拥有上下文不应该包含的信息。但这是一个证明概念应用程序。所以我决定保持简单并确保它可以实现。

问题:

当我试图与分配我在输出窗口和预期的怪异和不正常的行为发现绑定错误空视图模型空视图。这是没有道理的......是否有更简洁明了的方式让WPF知道如何处理它在嵌套视图控件中找到的任何绑定?我认为如果每个视图的构造函数如上所示为自己分配了一个对应的虚拟机,那么它应该工作,因为这在逻辑上是合理的。不幸的是,当它指定打开并隐藏其他视图的相应视图时,MainView上的所有按钮都会停止工作,并且具有关联的ViewModel。在一些按钮上起作用,而其他按钮则不起作用?这真的很奇怪?

回答

0

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

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

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

这会导致意外的行为,因为输出窗口告诉它它试图解析嵌套视图中的绑定表达式 - > viewmodels。实际上,它正在查找的虚拟机实际上是空的!

很明显,绑定系统是好的,当你没有明确地设置绑定语法内的源属性。聪明地找到自己的东西就够了。在我的情况下,它需要一些额外的帮助,因为它不确定在哪里可以找到东西。

SOLUTION:

  1. 在构造函数中的MainView删除构造函数声明为MainViewModel。
  2. 范围,通过xmlns为的ViewModels namesapce到您的MainView.xaml
  3. 创建的MainView的.xaml
  4. 给资源的关键内部的窗口资源。
  5. 将MainView xaml文件中的所有绑定升级为包含源属性。
  6. 为源属性指定一个静态资源绑定,指向您在步骤4中设置的ViewModel键值。
  7. 只对引用与MainView关联的ViewModel的绑定执行第6步。
  8. 所有嵌套的视图都应单独保留,他们应该在自己的xaml文件中处理自己的绑定。 MainView只是实例化它们并将它们放置到UI上。对我来说,情况就是这样,我没有任何关于嵌套视图的约束。位于MainView.xaml文件上的所有绑定都引用MainViewModel.cs中的数据。查看您的问题时,这样做会更容易。

出于某种原因,编辑器很尴尬,所以我选择省略任何示例代码,但上面的步骤足以说明我遵循的步骤。以上是为我工作的。

总结这个问题

  • 大部分书籍教短绑定语法
  • 当一个以上的数据上下文可用,会发生什么的另一种方式?
  • 绑定系统应该如何知道如何解决你的短手绑定表达式。