1

私は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 だけでよいのでしょうか?

ご協力いただきありがとうございます!

4

2 に答える 2

1

みんな、ありがとう!

私はついに答えを見つけました。

PRISM EventAggregator を実装し、以下を変更しました

インターフェイスとプラグイン

完全に削除されました

Public ReadOnly Property PlugInUI As System.Windows.Controls.UserControl Implements 
Contract.API.IPlugIn.PlugInUI
   Get
      Dim myUI As New UserControl1

      Return myUI
   End Get
End Property

ホストで

かわった

Public Sub OnImportsSatisfied() Implements 
System.ComponentModel.Composition.IPartImportsSatisfiedNotification.OnImportsSatisfied
    For Each plugInItem In WidgetList
        Desktop.Children.Add(plugInItem.PlugInView)
    Next
End Sub

Public Sub OnImportsSatisfied() Implements 
System.ComponentModel.Composition.IPartImportsSatisfiedNotification.OnImportsSatisfied
    For Each plugInItem In WidgetList
        Desktop.Children.Add(plugInItem)
    Next
End Sub

そして今、すべてが私が望んでいたように機能します!

于 2013-09-19T12:57:18.463 に答える