2012-03-14 55 views
1

我嘗試了Unity,並且在XAML中聲明我的viewmodel時出現問題。你能幫我嗎? XAML:在XAML中使用構造函數注入聲明ViewModel

<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做到這一點(我個人認爲更好)?

順便說一下:我創建了一個wpf應用程序,主要與web服務進行通信。我應該更喜歡用戶:團結還是MEF,兩者之間有什麼重大區別?

感謝, Raphi

回答

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; } 
} 
+0

啊我知道它不能正常工作。認爲也許棱鏡開發者有一些方便的黑客可能會實現這一點。太糟糕了。但你的解決方案比我的還要好。謝謝! – raphi011 2012-03-14 15:59:05

+0

@ raphi011其實,如果我沒有記錯的話,這不是我的解決方案,我從棱鏡書偷了它:) – chopikadze 2012-03-14 16:18:26