1. 私の Silverlight プロジェクトには、いくつかのプラグイン (IPlugin と IScreen を継承) があり、MEF を使用してそれらを ShellView (メイン ビュー) にインポートします。
2.次に、プラグインのメタデータ (プラグインのいくつかの基本的な説明を含め、自分で定義したもの) を ListBox にバインドします。
ここで、ListBox で選択したプラグイン (正確には PluginMetadata) に対応するビューモデルを ContentControl にロードする必要があります。問題は、実行時にビューモデルを決定してインスタンス化する必要があることです。私はたくさん検索しましたが、人々は通常、設計時にすでに決定されているビューモデルをアクティブにしているようです。例えば:
ActivateItem(new MyContentViewModel());
また:
<ContentControl x:Name="MyContent" cal:View.Model="{Binding Path=MyContentViewModel}" />
私の頭に浮かんだアイデアの 1 つは、PluginMetadata クラスで属性を定義してプラグインに対応する型を決定し、次のように使用することでした。
[Export(IPlugin)]
[PluginMetadata(Type=typeof(Plugin1), ...some other properties...)]
public class Plugin1 {...}
そして、リフレクションを使用して作成されたプラグインのインスタンスでビューモデルをロードします。
ActivateItem(Activator.CreateInstance<SelectedPluginMetadata.Type>());
または、プロパティ SelectedPluginType を追加すれば、バインディングも使用できます。
<ContentControl x:Name="MyContent" cal:View.Model="{Binding Path=SelectedPluginType}" />
ただし、メタデータ属性でタイプを渡すことは、非常に見栄えが悪く、DRY に反するようです。
それで、より良い解決策はありますか?