0

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

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

这是想法: 这是一个想法:

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

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

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

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

在视图模型的类中,我有“导出”属性,在视图的代码隐藏中,我有这个片段:

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

设置“视图模型”确实发生在“主视图”中,但不会发生在子视图中......

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

BindingExpression 路径错误:在“对象”“MainWindowViewModel”(HashCode=22047425)上找不到“SearchCommand”属性。绑定表达式:路径=搜索命令;DataItem='MainWindowViewModel' (HashCode=22047425); 目标元素是“按钮”(名称=“搜索”);目标属性是“命令”(类型“ICommand”)

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

为什么是这样 ?

4

1 回答 1

2

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

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

然后在 XAML 中:

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

这使 MEF 能够FilterFieldsViewModel为您创建一个实例并将其发送到SearchUserControl.

这当然是基本概念,也许你会想要创建一个 ' SearchViewModelBase' 或具有FilterFieldsViewModel.

于 2012-07-26T08:18:00.743 回答