0

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

应用程序 >启动 uri > MainWindow.xaml

    public MainWindow()
    {
        InitializeComponent();

        var viewModel = new MainViewModel();

        DataContext = viewModel;
    }

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

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

所以总的来说有'ONE'-> ViewModel。这似乎工作正常,但正如预期的那样,这个虚拟机已经变得很大并且需要重构。它包含在上下文中不应包含的信息。但这是一个证明概念的应用。所以我决定保持简单并确保它是可行的。

问题:

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

4

1 回答 1

0

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

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

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

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

很明显,当您没有在绑定语法中显式设置源属性时,绑定系统是好的。它很聪明,可以自己找到东西。就我而言,它需要一些额外的帮助,因为它不确定在哪里可以找到东西。

解决方案:

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

出于某种原因,编辑器很笨拙,所以我选择省略任何示例代码,但上述步骤的描述性足以遵循我所采取的步骤。以上是对我有用的。

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

  • 大多数书籍都教授较短的绑定语法
  • 当多个数据上下文可用时会发生什么?
  • 绑定系统应该如何知道如何解决您的速记绑定表达式。
于 2012-04-26T12:12:35.657 回答