2012-07-04 56 views
1

我有一個返回類型爲BaseItem的數組的服務。 BaseItem有N個子類型。我正在使用視圖模型在我的WPF應用程序(Prism,MVVM)中使用此服務。在這個視圖模型的構造函數中,我填充了一個可觀察的BaseItem類型的集合:使用Prism根據對象類型將視圖注入到ItemsControl中

public CurrentViewModel(IDataService dataService) 
{ 
    _dataService = dataService 

    var baseItems = _dataService.GetAllItems(); // there are many kinds of BaseItems 
    _baseItems = new ObservableCollection<BaseItem>(baseItems.ToList()); 
} 

到目前爲止好。在我的CurrentView中,我有一個ItemsControl綁定到這個集合。在這個控件中,我想通過使用另一個View(及其視圖模型)來渲染每個BaseItem

到現在爲止,我不能使用DataTemplateSelector因爲我不能在它定義每個DataTemplate中,我加載N個模塊(包含從BaseItem繼承的類)和PRISM dinamically加載它們從特定的文件夾。

我正在使用視圖模型第一種方法,還有什麼其他的替代方案,我必須實現該方案?

+0

http://stackoverflow.com/questions/5693863/inject-views-into-itemscontrol-depending-on-object-type是不是重複? – abatishchev

+0

也請[從您以前的帖子](http://stackoverflow.com/questions/11335884/view-injection-inside-itemscontrol)學習如何寫問題標題,以及如何不在那裏使用標籤。 – abatishchev

回答

1

只需將您的數據模板資源導出爲來自您的模塊的資源字典,並將其作爲DataType的特定子類型。我用MEF做這個,在我的主應用程序中合併這個resourcedictionarys。現在所有的數據模板/視圖都是WPF已知的,而itemscontrol會像你想要的那樣渲染每個子類型的視圖模型。

編輯:

modul1.dll

public class Modul1VM : BaseItemViewModel {} 

的ResourceDictionary在modul1.dll在modul2.d與MEF導出

<DataTemplate DataType="{x:Type local: Modul1VM}"> 
<view:Yourmodul1View/> 
</DataTemplate> 

modul2.dll

public class Modul2VM : BaseItemViewModel {} 

ResourceDictionary中LL出口與MEF

<DataTemplate DataType="{x:Type local: Modul2VM}"> 
<view:Yourmodul2View/> 
</DataTemplate> 

您的主應用程序

  • 合併全部出口Resourcedictionarys

app.xaml.cs

[ImportMany("Resourcen", typeof (ResourceDictionary))] 
private IEnumerable<ResourceDictionary> _importResourcen; 

OnStartup

foreach (var resourceDictionary in _importResourcen) 
{ 
    this.Resources.MergedDictionaries.Add(resourceDictionary); 
} 

你的ItemsControl只需要BaseItemViewModels的集合作爲的ItemsSource

+0

感謝您的解決方案。我使用的是MS Unity,而不是MEF,但實現起來非常簡單!只是一件事,所以在我的itemsControl我應該一個項目模板選擇器來找到資源的權利? –

+0

我會說你根本不需要模板選擇器。只要您的數據模板在您的應用程序的資源辭典中。 wpf知道如何渲染你的子視圖模型對象。多數民衆贊成在我這樣做的方式。 – blindmeis

+0

謝謝,我明白了!我雖然通過選擇器實現了...所以讓我改變主意!你說對了! –

相關問題