在XAML中使用构造函数注入声明ViewModel

在XAML中使用构造函数注入声明ViewModel,xaml,prism,unity-container,constructor-injection,Xaml,Prism,Unity Container,Constructor Injection,我正在尝试Unity,但在XAML中声明viewmodel时遇到问题。你能帮我吗? XAML: 当我尝试执行时,我得到一个resolutionfailedexception。 当viewmodel有一个空构造函数时,这就起作用了。它似乎在构造函数注入方面有问题 如果我像这样加载模块: var searchView = Container.Resolve<SearchBoxView>(); searchView.DataContext = Container.Resol

我正在尝试Unity,但在XAML中声明viewmodel时遇到问题。你能帮我吗? XAML:

当我尝试执行时,我得到一个resolutionfailedexception。 当viewmodel有一个空构造函数时,这就起作用了。它似乎在构造函数注入方面有问题

如果我像这样加载模块:

var searchView = Container.Resolve<SearchBoxView>();
        searchView.DataContext = Container.Resolve<SearchBoxViewModel>();
        //RegionManager.RegisterViewWithRegion(RegionNames.SearchRegion, typeof(SearchBoxView));
        RegionManager.Regions[RegionNames.SearchRegion].Add(searchView);
var searchView=Container.Resolve();
searchView.DataContext=Container.Resolve();
//RegionManager.RegisterViewWithRegion(RegionNames.SearchRegion,typeof(SearchBoxView));
RegionManager.Regions[RegionNames.SearchRegion].Add(searchView);
它起作用了

有没有可能用xaml实现这一点(我个人认为用xaml更好)

顺便说一下:我正在使用wpf创建一个应用程序,它主要与Web服务通信。我应该选择什么:unity还是MEF?两者之间的最大区别是什么

谢谢, 拉菲:

自定义类作为XAML元素的要求

为了能够被实例化为对象元素,您的 类必须满足以下要求:

  • 您的自定义类必须是公共类并且支持默认类 (无参数) 公共构造函数。(请参见以下章节了解有关 结构。)

因此,如果您想使用依赖项,您应该更正如下内容:

var searchView = Container.Resolve<SearchBoxView>();

public class SearchBoxView: UserControl
{
  [Dependency]
  public SearchBoxViewModel ViewModel
  {
    get { return (SearchBoxViewModel)DataContext; }
    set { DataContext = value; }
}
var searchView=Container.Resolve();
公共类SearchBoxView:UserControl
{
[依赖性]
公共SearchBoxViewModel视图模型
{
获取{return(SearchBoxViewModel)DataContext;}
设置{DataContext=value;}
}

自定义类作为XAML元素的要求

为了能够被实例化为对象元素,您的 类必须满足以下要求:

  • 您的自定义类必须是公共类并且支持默认类 (无参数) 公共构造函数(有关 结构。)

因此,如果您想使用依赖项,您应该更正如下内容:

var searchView = Container.Resolve<SearchBoxView>();

public class SearchBoxView: UserControl
{
  [Dependency]
  public SearchBoxViewModel ViewModel
  {
    get { return (SearchBoxViewModel)DataContext; }
    set { DataContext = value; }
}
var searchView=Container.Resolve();
公共类SearchBoxView:UserControl
{
[依赖性]
公共SearchBoxViewModel视图模型
{
获取{return(SearchBoxViewModel)DataContext;}
设置{DataContext=value;}
}

是的,我知道它不会正常工作。我想也许prism开发人员有一些简便的黑客技术,可能已经实现了这一点。太糟糕了。但你的解决方案仍然比我的好。谢谢!@raphi011事实上,如果我没记错的话,这不是我的解决方案,我从prism书中偷了它:)是的,我知道它不会正常工作。我想prism开发者可能有一些很好的方法可以实现这一点。太糟糕了。但是你的解决方案还是比我的好。谢谢!@raphi011事实上,如果我没记错的话,这不是我的解决方案,我从prism书中偷来的:)
var searchView = Container.Resolve<SearchBoxView>();

public class SearchBoxView: UserControl
{
  [Dependency]
  public SearchBoxViewModel ViewModel
  {
    get { return (SearchBoxViewModel)DataContext; }
    set { DataContext = value; }
}