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

时间:2012-03-14 15:03:06

标签: xaml prism unity-container constructor-injection

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

<UserControl.DataContext>
    <search:SearchBoxViewModel />
</UserControl.DataContext>

构造

   [ImportingConstructor]
    public SearchBoxViewModel(IRegionManager regionManager, IEventAggregator eventAggregator)
    {
        this.regionManager = regionManager;
        this.eventAggregator = eventAggregator;
    }

当我尝试执行时,我得到了resolutionfailedexception。 当viewmodel有一个空构造函数时,这个工作。好像它的构造函数注入有问题。

如果我像这样加载模块:

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

有效。

有没有可能用xaml做这个(我个人认为更好)?

顺便说一句:我正在创建一个主要与web服务通信的wpf应用程序。我应该更倾向于用户:团结还是MEF以及两者之间的巨大差异?

谢谢, Raphi

1 个答案:

答案 0 :(得分:1)

http://msdn.microsoft.com/en-us/library/ms753379.aspx

  

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

     

为了能够被实例化为对象元素,你的   班级必须符合以下要求:

     
      
  • 您的自定义类必须是公开的,支持默认值   (无参数)   公共构造函数。 (有关说明,请参阅以下部分   结构。)

  •   
  • ...

  •   

所以,如果你想使用依赖项,你应该像:

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

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