我有一个返回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。
我正在使用视图模型第一种方法,我还有什么其他选择来实现方案?
答案 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>
您的主要应用
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