使用Prism根据对象类型将视图注入ItemsControl

时间:2012-07-04 18:05:45

标签: c# wpf silverlight mvvm prism

我有一个返回BaseItem类型数组的服务。 BaseItem有N个子类型。我正在使用视图模型在我的WPF应用程序(Prism,MVVM)中使用此服务。在此视图模型的构造函数中,我填充了一个类型为BaseItem的可观察集合:

public CurrentViewModel(IDataService dataService) 
{ 
    _dataService = dataService

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

到目前为止一切顺利。在我的CurrentView中,我有ItemsControl绑定到此集合。在此控件中,我想使用另一个BaseItem(及其视图模型)渲染每个View

到现在为止,我无法使用DataTemplateSelector,因为我无法在其中定义每个DataTemplate,我正在加载N个模块(其中包含从BaseItem继承的类)并且PRISM加载它们来自特定文件夹的dinamically。

我正在使用视图模型第一种方法,我还有什么其他选择来实现方案?

1 个答案:

答案 0 :(得分:1)

只需将您的datatemplate资源作为资源字典从模块中导出,并将特定子类型作为DataType。我用MEF做这个,在我的主应用程序中合并这个资源。现在所有的数据窗口/视图都是WPF已知的,itemscontrol会像你想要的那样呈现每个子类型视图模型。

编辑:

modul1.dll

public class Modul1VM : BaseItemViewModel {} 

使用MEF导出的modul1.dll中的ResourceDictionary

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

modul2.dll

public class Modul2VM : BaseItemViewModel {} 
用pF导出modul2.dll中的ResourceDictionary

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

您的主要应用

  • 合并alle出口的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