C# 子视图不实例化其';查看模型';自动地

C# 子视图不实例化其';查看模型';自动地,c#,wpf,exception,view,prism,C#,Wpf,Exception,View,Prism,我在PRISM体系结构中有一个WPF应用程序 我有一个用户控件(视图),其中有两个用户控件 “搜索用户控件”之所以在其自己的用户控件中,是因为我计划在我的应用程序中重用它 主用户控件(黑色)称为“MainView”,其中包含两个用户控件: -一个用户控件,它有几个文本框控件和一个“搜索”按钮 -具有网格的用户控件,我在其中显示结果 每个用户控件(以及父控件“主视图”)都是“视图”,并具有“视图模型” 除了“子”用户控件不会自动创建自己的“视图模型”之外,所有内容都显示得很好 在视图模型的类中

我在PRISM体系结构中有一个WPF应用程序

我有一个用户控件(视图),其中有两个用户控件

“搜索用户控件”之所以在其自己的用户控件中,是因为我计划在我的应用程序中重用它

主用户控件(黑色)称为“MainView”,其中包含两个用户控件: -一个用户控件,它有几个文本框控件和一个“搜索”按钮 -具有网格的用户控件,我在其中显示结果

每个用户控件(以及父控件“主视图”)都是“视图”,并具有“视图模型”

除了“子”用户控件不会自动创建自己的“视图模型”之外,所有内容都显示得很好

在视图模型的类中,我有“导出”属性, 在视图的代码中,我有以下代码片段:

[Import]
FilterFieldsViewModel ViewModel
{           
    set
    {
       this.DataContext = value;
    }
}
设置“视图模型”对“主视图”不起作用,但对子视图不起作用

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

BindingExpression路径错误:在“对象”“MainWindowViewModel”(HashCode=22047425)上找不到“SearchCommand”属性。BindingExpression:Path=SearchCommand;DataItem='MainWindowViewModel'(HashCode=22047425);目标元素是“按钮”(Name='Search');目标属性为“Command”(类型为“ICommand”)

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


这是为什么?

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

[Import]
public FilterFieldsViewModel FilterFieldsViewModel {get; set; }
然后在XAML中:

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

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


这是基本概念,当然,也许您想创建一个“
SearchViewModelBase
”或具有
FilterFieldViewModel

伟大解决方案的东西,只有一个问题-主视图和子视图不耦合吗?我在某个地方读到,一个可能的解决方案可能是为“搜索控件”和“网格控件”定义一个区域,然后使用MEF将控件自动加载到这些区域。这种方法的问题是,在设计过程中,我无法看到最终的“主”窗口中的控件是什么样子。。。你明白吗?@JohnMiner你的确是对的,从体系结构的角度来看,定义子区域是一个更好的解决方案,但它需要更多的工作,所以我想这更像是一个“财务”决策。这个问题应该提供一些关于作用域子区域的信息。