我目前正在尝试设计一个通过 MEF 导入加载视图模型的应用程序。
到目前为止一切顺利,我从 viewmodel 导航到 viewmodel,通过字典加载了每个 vm 数据模板。
每次导航时,我都会在我的 Shell (MainWindow) 中修改主要 contentPresenter 的内容。
其中一个视图模型允许我为 activeX 控件(例如 acrobat reader)显示 WindowFormHost。由于 WindowFormHost 不允许绑定,所以我在视图模型中创建了 windowFormHost 并将其绑定到视图中的 ContentPresenter。
这就是失败的地方:当返回到相同的视图模型时,视图会再次创建……抛出“元素已经是另一个元素的子元素”。错误。
我怎样才能防止这种情况?重新加载视图时我应该卸载 WindowFormHost 吗?或者我可以保留视图实例,以便每个视图只保留一个实例并让数据绑定更新控件吗?(它看起来更好的内存消耗)。
谢谢你的帮助 !
[编辑]
加载字典:
<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>
虚拟机(单例,mef 模块):
[Export(typeof(IDAVPDC3DVIAControl))]
public partial class DAVPDC3DVIAControlViewModel : ViewModelBase, IViewModel, IPartImportsSatisfiedNotification
虚拟机(主窗口)
[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;
}
}
}
}
}