2009-11-14 17 views
4

我剛開始使用MVVM,並開始理解事情。我目前正在試驗Cinch框架,儘管我還沒有承諾它。
我通過在視圖的代碼隱藏中引用ViewModel來將視圖模型注入到視圖中,該屬性具有[Dependency]屬性,並且在設置器中,它將DataContext設置爲正確的視圖,統一。整齊的把戲,我想。獲取Unity來解析XAML中的視圖

我試圖讓我的應用程序作爲單個窗口,注入視圖(相對於多個窗口,並處理打開\關閉它們) 我將視圖從Windows更改爲UserControls,並添加到主窗口。 工作,但ViewModel從未注入,大概是因爲XAML不使用Container.Resolve創建視圖,因爲當我創建視圖並使用Resolve在代碼隱藏中手動添加它時,[依賴項]是創建。

如何設置我的窗口,以便如果我通過XAML添加視圖,或者視圖因UI操作等而更改,則它通過Unity獲取它,以便它可以發揮它的魔力?

回答

3

解決你的問題的方法是讓你的窗口也有一個ViewModel,用UserControls的ViewModels作爲它的屬性公開。然後,在您的XAML中,您只需使用Binding機制將UserControl的DataContexts綁定到您的主ViewModel的正確屬性。並且由於該主ViewModel是從Unity容器中解析出來的,因此它將根據需要注入所有其他ViewModel。

+0

謝謝,我想我現在擁有它。我有一個 <用戶控制內容= {綁定MainViewModel}「/> 與DataTemplate應用適當的視圖來顯示它 把ViewModel類作爲UserControl的內容令我困惑; D – Kage 2009-11-15 21:12:10

4

此問題通常使用Regions和RegionManager解決。在主窗口ViewModel中,創建一組區域並將其添加到RegionManager。然後ViewModels可以被解析並添加到Region.Views集合中。

在XAML中,通常通過將ItemsControl的ItemsSource屬性綁定到主ViewModel的region屬性來注入區域。

因此,在主屏幕視圖模型,你會有這樣的事情:

public class TestScreenViewModel 
{ 
    public const string MainRegionKey = "TestScreenViewModel.MainRegion"; 

    public TestScreenViewModel(IUnityContainer container, IRegionManager regionManager) 
    { 
     this.MainRegion = new Region(); 
     regionManager.Regions.Add(MainRegionKey, this.MainRegion); 
    } 

    public Region MainRegion { get; set; } 
} 

這將是您的IModule

 #region IModule Members 

    public void Initialize() 
    { 
     RegisterViewsAndServices(); 

     var vm = Container.Resolve<SelectorViewModel>(); 
     var mainScreen = Container.Resolve<TestScreenViewModel>(); 
     mainScreen.MainRegion.Add(vm); 

     var mainView = ContentManager.AddContentView("Test harness", mainScreen); 
    } 

    #endregion 

正常解決,您的模板看起來像的XAML表示

<DataTemplate DataType="{x:Type TestModule:TestScreenViewModel}"> 
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Auto"> 
     <StackPanel> 
      <ItemsControl ItemsSource="{Binding Path=MainRegion.Views}" /> 
     </StackPanel> 
    </ScrollViewer> 
</DataTemplate>