wpf 在具有对象作为有效负载的视图模型之间使用 Prism 6 事件聚合器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/42451146/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 14:01:31  来源:igfitidea点击:

Using Prism 6 Event Aggregator between view models with an object as the payload

c#wpfmvvmprismeventaggregator

提问by slaws

Hi I'm hoping one of you could help me with some syntax.

嗨,我希望你们中的一个人可以帮助我了解一些语法。

So I'm following this example https://www.codeproject.com/Tips/591221/Simple-EventAggregator-in-WPF-PRISMon using Prism Event Aggregator to send messages from one ViewModel to another.

所以我正在关注这个例子https://www.codeproject.com/Tips/591221/Simple-EventAggregator-in-WPF-PRISM关于使用 Prism Event Aggregator 将消息从一个 ViewModel 发送到另一个。

The following code works great when publishing a single string as the payload.

以下代码在将单个字符串作为有效负载发布时效果很好。

internal class OrderSelectedEvent_SS : PubSubEvent<string>
{
    private static readonly EventAggregator _eventAggregator;
    private static readonly OrderSelectedEvent_SS _event;

    static OrderSelectedEvent_SS()
    {
        _eventAggregator = new EventAggregator();
        _event = _eventAggregator.GetEvent<OrderSelectedEvent_SS>();
    }

    public static OrderSelectedEvent_SS Instance
    {
        get { return _event; }
    }
}

Publisher (In ViewModel1):

发布者(在 ViewModel1 中):

OrderSelectedEvent_SS.Instance.Publish(_strCurrentOrder);

Subscriber (In ViewModel2:

订阅者(在 ViewModel2 中:

OrderSelectedEvent_SS.Instance.Subscribe(OrderSelectedEventHandler_SS);
private void OrderSelectedEventHandler_SS(string strSelectedOrder)
    {
        CurrentOrder = strSelectedOrder;
    }

What I'm trying to do is modify to accept an object (a class with multiple strings) as the payload. Here's what I have so far:

我想要做的是修改以接受一个对象(具有多个字符串的类)作为有效负载。这是我到目前为止所拥有的:

internal class OrderSelectedEvent : PubSubEvent<object>
{
    private static readonly EventAggregator _eventAggregator;
    private static readonly OrderSelectedEvent _event;
    static OrderSelectedEvent()
    {
        _eventAggregator = new EventAggregator();
        _event = _eventAggregator.GetEvent<OrderSelectedEvent>();
    }

    public static OrderSelectedEvent Instance
    {
        get { return _event; }
    }

    public class OrderSelectedPayload
    {
        public string SelectedOrder { get; set; }
        public string SelectedE32 { get; set; }
    }
}

Publisher (In ViewModel1):

发布者(在 ViewModel1 中):

OrderSelectedEvent.OrderSelectedPayload ospl = new OrderSelectedEvent.OrderSelectedPayload();
ospl.SelectedOrder = _strCurrentOrder;
ospl.SelectedE32 = _strCurrentE32JobNumber;
OrderSelectedEvent.Instance.Publish(ospl);

Subscriber (In ViewModel2:

订阅者(在 ViewModel2 中:

OrderSelectedEvent.Instance.Subscribe(OrderSelectedEventHandler); 

I'm getting an error here on the subsriber: **ERROR: cannot convert from 'method group' to 'Action'**** and I can't seem to figure out what I need to do.

我在订阅者上遇到错误:**错误:无法从“方法组”转换为“操作”****,我似乎无法弄清楚我需要做什么。

private void OrderSelectedEventHandler(OrderSelectedEvent.OrderSelectedPayload ospl)
{
    CurrentOrder = ospl.SelectedOrder;
    CurrentE32JobNumber = ospl.SelectedE32;
}

Thanks in advance for any guidance you can provide.

预先感谢您提供的任何指导。

回答by Brandon Kramer

Your problem is simple: You are defining the event to pass an objectas payload, then trying to use a specific class as payload instead. To fix this, change

您的问题很简单:您正在定义事件以object作为有效负载传递,然后尝试使用特定类作为有效负载。要解决此问题,请更改

internal class OrderSelectedEvent : PubSubEvent<object>

To:

到:

internal class OrderSelectedEvent : PubSubEvent<OrderSelectedPayload>

Alternatively, you could change your handler signature to match the expected parameters of the event:

或者,您可以更改处理程序签名以匹配事件的预期参数:

private void OrderSelectedEventHandler(OrderSelectedEvent.OrderSelectedPayload ospl)

To:

到:

private void OrderSelectedEventHandler(object ospl)