我是 MEF 的新手,并开始了一个项目来测试它。我想要做的是打开一个 MainForm 来加载基于接口的插件。这些插件需要能够在它们之间交换信息,并且 MainForm 也应该能够与所有插件进行通信。因此,我首先创建了加载插件的 MainForm。该插件只是一个包含 ListBox 的表单。在 MainForm 我有一个按钮。我希望该按钮将 List(of String) 发送到插件,并且该插件将 List(of String) 加载到 ListBox 中。目前,当我单击 MainForm 按钮时,它会将列表发送到插件。但该列表未加载到插件 ListBox 中。为了找到问题所在,我在 MainForm 上添加了一个新按钮,以验证插件属性是否实际包含我发送的列表(字符串)。是的,该列表包含我所有的字符串。问题应该是 ListBox 没有刷新?
部分界面:
Public Interface IPlugIn
Property PlugInName as string
Property Files As List(Of String)
End Interface
MainForm 按钮中的代码:
Dim currentPlugIn As Contract.API.IPlugIn
currentPlugIn = PlugIns.Find(Function(x) x.PlugInName = "Test")
currentPlugIn.Files = IO.Directory.GetFiles("SomeFolder").ToList
插件中的代码:
<Export(GetType(Contract.API.IPlugIn))> _
Public Class UserControl1
Implements System.ComponentModel.INotifyPropertyChanged, Contract.API.IPlugIn
Public Property Files As System.Collections.Generic.List(Of String) Implements
Contract.API.IPlugIn.Files
Get
If IsNothing(_files) Then
_files = New List(Of String)
End If
Return _files
End Get
Set(value As System.Collections.Generic.List(Of String))
_files = value
OnPropertyChanged("Files")
End Set
End Property
Public Event PropertyChanged(sender As Object, e As
System.ComponentModel.PropertyChangedEventArgs) Implements
System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Public Sub OnPropertyChanged(propertyName As String)
RaiseEvent PropertyChanged(Me, New
ComponentModel.PropertyChangedEventArgs(propertyName))
End Sub
插件 XAML 中的代码:
<ListBox Name="lstFiles" ItemsSource="{Binding Path=Files}"/>
有什么问题?我在互联网上搜索示例并找到数百个示例,但没有一个显示如何做我想做的事。就在这里发布我的问题之前,我添加了 INotifyPropertyChanged,它没有解决问题。对我来说,使用 PRISM、Caliburn.Micro 或者 MEF 会更好吗?
谢谢你的帮助!