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 としてモジュールから datatemplate リソースを resourcedictionary としてエクスポートするだけです。私はこれをMEFで行い、メインアプリでこのresourcedictionarysをマージします。これで、すべてのデータ テンプレート/ビューが WPF に認識され、アイテム コントロールがすべてのサブタイプ ビューモデルを必要に応じてレンダリングします。

編集:

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 {} 

MEF でエクスポートされた modul2.dll の ResourceDictionary

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

あなたのメインアプリ

  • エクスポートされたすべての Resourcedictionarys をマージします

app.xaml.cs

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

始めるとき

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

あなたのアイテムコントロールはアイテムソースとして BaseItemViewModels のコレクションを必要とするだけです

于 2012-07-05T07:28:03.650 に答える