私は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
PlugIn XAML のコード:
<ListBox Name="lstFiles" ItemsSource="{Binding Path=Files}"/>
どうしたの?インターネットで例を検索し、何百もの例を見つけましたが、やりたいことを実行する方法を示しているものはありません。ここに質問を投稿する直前に、INotifyPropertyChanged を追加しましたが、問題は解決しませんでした。PRISM、Caliburn.Micro を使用した方がよいでしょうか、それとも MEF だけでよいのでしょうか?
ご協力いただきありがとうございます!