具有事件的复合 WPF GUI 界面

本文关键字:WPF GUI 界面 复合 事件 | 更新日期: 2023-09-27 18:33:23

使用Prism4和MEF,我创建了一个shell和两个模块(M1,M2)。

我确实想在 M1 中打开一个串行端口,并使用接口,使用来自打开的串行端口的数据接收事件,我希望 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;
    }
}

模块模型.cs

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

模块模型.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();
}

具有事件的复合 WPF GUI 界面

定义复合演示事件,通过导出一个派生自 Prism 的 'CompositePresentationEvent' 的分类,其中 T 是事件的"有效负载"的类型。

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

让您的两个 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 中执行相同的操作,如果事件在应用程序中的任何位置引发,两者都会收到通知。

MSDN 中提供了一个快速入门解决方案,它描述了如何从一个模块发布事件以及从另一个模块订阅事件。可以在以下棱镜指南附录中找到事件聚合快速入门

  • 附录 G:快速入门 - 事件聚合快速入门

有关事件聚合器如何工作的更多信息,您可以参考以下棱镜指南章节:

  • 松散耦合组件之间的通信

问候。