1

我有一个服务返回 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 从特定文件夹动态加载它们。

我正在使用视图模型优先方法,我还需要哪些其他替代方案来实现该场景?

4

1 回答 1

1

只需将您的数据模板资源作为资源字典从您的模块中导出,并将特定子类型作为 DataType。我使用 MEF 执行此操作,并在我的主应用程序中合并此资源字典。现在 WPF 知道所有数据模板/视图,并且 itemscontrol 呈现您想要的每个子类型视图模型。

编辑:

模块1.dll

public class Modul1VM : BaseItemViewModel {} 

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

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

模块2.dll

public class Modul2VM : BaseItemViewModel {} 

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

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

你的主应用

  • 合并所有导出的资源字典

应用程序.xaml.cs

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

启动时

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

您的 itemscontrol 只需要 BaseItemViewModels 的集合作为 itemssource

于 2012-07-05T07:28:03.650 回答