子视图不会自动实例化其“视图模型”

时间:2012-07-25 22:16:32

标签: c# wpf exception-handling views prism

我在PRISM架构中有一个WPF应用程序。

我有一个用户控件(视图),里面有2个用户控件。

Here is the idea : Here is an idea : http://s18.postimage.org/5i0vik8vr/SO_Question_6.png

“搜索用户控件”在其自己的用户控件中的原因是因为我打算在我的应用程序中重用它。

主要用户控件(黑色)称为“MainView”,其中包含2个用户控件: - 具有多个可以过滤的文本框控件的用户控件,以及“搜索”按钮 - 具有网格的用户控件,其中显示结果

这些用户控件(以及父级“主视图”)中的每一个都是“视图”并具有“视图模型”。

除了“孩子”用户控件不会自动创建自己的“视图模型”这一事实外,一切都很好。

在视图模型的类中,我有'Export'属性, 在View的代码隐藏中,我有这个片段:

[Import]
FilterFieldsViewModel ViewModel
{           
    set
    {
       this.DataContext = value;
    }
}

为“主视图”设置“视图模型”确实,但不会为子视图设置...

我有一个绑定到“搜索用户控件”的“搜索”按钮的命令, 当应用程序加载时 - 我在输出窗口中出现错误,说:

  

BindingExpression路径错误:'object'''MainWindowViewModel'(HashCode = 22047425)'上找不到'SearchCommand'属性。 BindingExpression:路径= SearchCommand; DataItem ='MainWindowViewModel'(HashCode = 22047425); target元素是'Button'(Name ='Search'); target属性是'Command'(类型'ICommand')

由于某种原因,来自'child'用户控件的命令尝试绑定到主窗口视图模型中的视图模型,因为由于某种原因 - 未实例化子用户控件的视图模型。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

您的依赖注入容器(MEF)未在子视图上注册导入,因为它们是由MainView创建的,而不是由MEF创建的。您可能想要做的是在MainViewModel上创建一个属性:

[Import]
public FilterFieldsViewModel FilterFieldsViewModel {get; set; }

然后在XAML中:

<UserControl ....>
   ...
   <SearchUserControl DataContext="{Binding FilterFieldsViewModel}" ... />
   ...
</UserControl>

这使MEF能够为您创建FilterFieldsViewModel的实例,并将其发送到SearchUserControl

这是当然的基本概念,也许您可​​能想要创建一个“SearchViewModelBase”或具有FilterFieldsViewModel的东西。