現在、MEF インポートを介してビューモデルをロードするアプリケーションを設計しようとしています。
これまでのところ、辞書を介して各 vm データテンプレートを読み込んで、viewmodel から viewmodel に移動しました。
ナビゲートするたびに、シェル (MainWindow) のメイン contentPresenter のコンテンツを変更します。
ビューモデルの 1 つを使用すると、activeX コントロール (たとえば、アクロバット リーダーなど) の WindowFormHost を表示できます。WindowFormHost ではバインドが許可されていないため、ビューモデルで windowFormHost を作成し、ビューで ContentPresenter にバインドしました。
そして、ここで失敗します。同じビューモデルに戻ると、ビューが再度作成されます...「要素はすでに別の要素の子です」をスローします。エラー。
どうすればそれを防ぐことができますか? ビューがリロードされたときに WindowFormHost をアンロードする必要がありますか? または、ビューごとにインスタンスを 1 つだけ保持し、データ バインディングでコントロールを更新できるように、ビュー インスタンスを保持することはできますか? (メモリ消費のほうが良さそうです)。
ご協力いただきありがとうございます !
[編集]
読み込まれた辞書:
<DataTemplate x:Shared="False" DataType="{x:Type vm:DAVPDC3DVIAControlViewModel}">
<vw:MyUserControl />
</DataTemplate>
意見 :
<DockPanel>
<ContentControl Name="WFH3DVia" Content="{Binding Path=Control3DVIA, Mode=OneWay} </ContentControl>"
<!--<WindowsFormsHost Name="WFH3DVia"></WindowsFormsHost>-->
</DockPanel>
VM (シングルトン、mef モジュール) :
[Export(typeof(IDAVPDC3DVIAControl))]
public partial class DAVPDC3DVIAControlViewModel : ViewModelBase, IViewModel, IPartImportsSatisfiedNotification
VM (メイン ウィンドウ)
[Export]
public class MainWindowViewModel : ViewModelBase, IPartImportsSatisfiedNotification
// CurrentUC はメイン ウィンドウ ビューをコントローラーのアクティブなビューモデルにバインドします
public IViewModel CurrentUC
{
get
{
return myAddinManager.CurrentVM;
}
}
メインビュー:
コントローラー (イベント時にモジュールを表示) :
private void ModuleReadyEventAction(string iModuleName)
{
if (null != this.Modules && this.Modules.Count() > 0)
{
foreach (var item in Modules)
{
IBaseModule ibasemodule = item as IBaseModule;
if (null != ibasemodule)
{
Type tp = ibasemodule.GetType();
if (0 == tp.Name.CompareTo(iModuleName))
{
CurrentVM = ibasemodule.GetViewModel();
break;
}
}
}
}
}