是否可以从库中查找或定义资源?

时间:2018-03-23 09:09:16

标签: c# mvvm dialog mef

我有 WPF 应用程序here,它位于 MVVM 模式中,使用 MVVMLight 作为框架和 MEF 具有名为 VCNEditor 的用户控件的插件。

主应用程序使用名为DialogBehavior的DialogViewModel的附加行为来显示Dialogboxes。 DialogBehavior使用以下命令将视图绑定到其预先创建的DialogViewModel : IDialogViewModel(viewmodel优先):

var resource = Application.Current.TryFindResource(viewModel.GetType());

插件是一个带有UserControl的库。 UserControl是从“扩展”目录动态加载的,只有在可见时才会显示。

到目前为止这是有效的。我目前面临的问题是:我尝试以与在主应用程序中相同的方式在我的插件中显示对话框。

含义:我定义了一个名为“对话框”的属性

ObservableCollection<IDialogViewModel>

在我的UserControlViewModel : IDialogViewModel和DataBind中,该属性为附加行为

当我现在将新的DialogViewModel添加到该集合

Application.Current.TryFindResource(viewModel.GetType())

无法找到任何资源,因为Application.Current正在返回主应用程序,并且库没有像主应用程序中的app.xaml那样的任何资源字典。

我无法将插件对话框的资源添加到主应用程序中,因为这会破坏我松散耦合的插件架构。

我只是一个休闲开发者,如果有人能指出我正确的方向,那就太好了。 目前的解决方法是,我在每个viewmodels construcor中“手动”创建视图。但我认为这看起来非常好。

感谢您的支持。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以轻松地将插件样式和资源添加到代码中的Application.Current.Resources

解决此问题的一种方法是为插件创建合并的Dictionary架构。在您的 MEF 插件接口上实施HasResource bool 属性ResourceDictionary/ResourceDictionaries 属性

当您加载插件时,只需检查这些属性,是否有资源只需通过

将它们添加到主机应用程序中
Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary);

其他资源

Application.Resources Property

  

获取或设置应用程序范围资源的集合,例如   风格和画笔。

ResourceDictionary.MergedDictionaries Property

  

获取ResourceDictionary词典的集合   构成合并中的各种资源词典   字典。

ResourceDictionary Class

  

提供包含WPF的哈希表/字典实现   组件和WPF应用程序的其他元素使用的资源。