1

Prism4 と MEF を使用して、シェルと 2 つのモジュール (M1、M2) を作成しました。

M1 でシリアル ポートを開きたいのですが、インターフェイスを使用して、開いたシリアル ポートからの datareceived イベントを使用して、M2 に通知を受け取り、シリアル ポートからデータを受信するようにします。

具体的にはMVVMのパターンを使っているので、M1のViewModel内でシリアルポートを開放し、データを受信したらM2のViewModelに通知したい。

残念ながら、PRISM ワークフロー内でインターフェイスを使用する方法がよくわかりません。私はすべての助けに感謝しています。この問題の例が本当に必要です。質問を明確にするためだけにコードを追加しました。

前もって感謝します。

モジュール A.cs

[ModuleExport(typeof(ModuleA), InitializationMode = InitializationMode.OnDemand)]
public class ModuleA : IModule
{
    [ImportingConstructor]
    public ModuleB(IEventAggregator eventAggregator_)
    {
        EventAggregator = eventAggregator_;

    }

    [Import]
    public IRegionManager RegionManager { get; set; }


    public void Initialize()
    {

        this.RegionManager.RegisterViewWithRegion("RegionA", typeof(ZeroGrid1));

    }
}

モジュール B.cs

[ModuleExport(typeof(ModuleB), InitializationMode = InitializationMode.OnDemand)]
public class ModuleB : IModule
{
    [ImportingConstructor]
    public ModuleB(IEventAggregator eventAggregator_)
    {
        EventAggregator = eventAggregator_;

    }

    [Import]
    public IRegionManager RegionManager { get; set; }


    public void Initialize()
    {

        this.RegionManager.RegisterViewWithRegion("RegionB", typeof(ZeroGrid2));

    }
}

ZeroGrid1.xaml.cs (ZeroGrid.xaml.cs に類似)

[Export]
public partial class ZeroGrid1
{
    [ImportingConstructor]
    public ZeroGrid1(ZeroGridViewModel1 viewModel)
    {
        InitializeComponent();
        this.DataContext = viewModel;
    }
}

ModuleAViewModel.cs

[Export]
public class ModuleAViewModel: NotificationObject, IDataReciever
{
// OPEN SERIALPORT
//SEND SOMETHING SERIALPORT
//Maybe I also wanna get notification for datareceived here
}

ModuleBViewModel.cs

[Export]
public class ModuleBViewModel: NotificationObject, IDataReciever
{
//GET NOTIFIED WHEN DATARECEIVED FROM SERIALPORT AND RECEIVED DATA
}

IDataReceiver.cs

interface IDataReciever<TData>
{
event Action<TData> DataRecieved;
//some other methods, such as, for example:
//void Open();
//void Close();
}
4

2 に答える 2

1

1 つのモジュールからイベントを発行し、別のモジュールからイベントをサブスクライブする方法を説明する、 MSDNで利用可能なQuickStartソリューションがあります。Event Aggregation QuickStartは、次のPrism Guide Appendixにあります。

EventAggregatorの仕組みの詳細については、 Prism Guideの次の章を参照してください。

よろしく。

于 2013-09-30T16:45:46.240 に答える
1

Prism の「CompositePresentationEvent」から派生したクラスをエクスポートすることにより、複合プレゼンテーション イベントを定義します。ここで、T はイベントの「ペイロード」のタイプです。

[Export]
public class DataReceivedEvent : CompositePresentationEvent<object>
{}

2 つの ViewModel にそのイベントをインポートさせます。

[Export]
public class ModuleAViewModel: NotificationObject, IDataReciever
{

    private DataReceivedEvent _dataReceivedEvent;

    [ImportingConstructor]
    public ModuleAViewModel(DataReceivedEvent dataReceivedEvent)
    {
        _dataReceivedEvent = dataReceivedEvent;
        _dataReceivedEvent.Subscribe(OnDataReceived);
    }

    private void OnDataReceived(object payload)
    {
        // Handle received data here
    }

    // This method gets called somewhere withing this class
    private void RaiseDataReceived(object payload)
    {
        _dataReceivedEvent.Publish(payload);
    }
}

ViewModelB で同じことを行うと、アプリケーションのどこかでイベントが発生した場合に両方に通知されます。

于 2013-09-30T16:28:59.073 に答える