Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 知道消息来自哪个订阅,在相同的视图模型中,相同的类型_C#_Wpf_Caliburn.micro_Eventaggregator - Fatal编程技术网

C# 知道消息来自哪个订阅,在相同的视图模型中,相同的类型

C# 知道消息来自哪个订阅,在相同的视图模型中,相同的类型,c#,wpf,caliburn.micro,eventaggregator,C#,Wpf,Caliburn.micro,Eventaggregator,我很难理解如何使用Caliburn Micro、事件聚合器实现这一点,我有一个视图模型,可以调用2个不同的窗口,在演示之前,我订阅了一个string类型的句柄,它可以工作,但现在我想知道在句柄方法中,subscribe从中得到了以下消息: public void Causale() { var asm = Assembly.LoadFrom(@"V.M.Tabelle.Magazzino.Causale.dll"); var module = _s

我很难理解如何使用Caliburn Micro、事件聚合器实现这一点,我有一个视图模型,可以调用2个不同的窗口,在演示之前,我订阅了一个string类型的句柄,它可以工作,但现在我想知道在句柄方法中,subscribe从中得到了以下消息:

    public void Causale()
    {
        var asm = Assembly.LoadFrom(@"V.M.Tabelle.Magazzino.Causale.dll");
        var module = _shell.LoadModule(asm);

        if (module != null)
        {
            _eventAggregator.Subscribe(this);

            module.Show("Add");

            //_shell.CurrentView = (new ShellMenuItem { Caption = "Tiard", ScreenViewModel = module });
        }
    }

    public void CausaleList()
    {
        var asm = Assembly.LoadFrom(@"V.M.Tabelle.Magazzino.Causale.dll");
        var module = _shell.LoadModule(asm);

        if (module != null)
        {
            _eventAggregator.Subscribe(this);

            module.Show("List");

            //_shell.CurrentView = (new ShellMenuItem { Caption = "Tiard", ScreenViewModel = module });
        }
    }


    public void Handle(string message)
    {
        _eventAggregator.Unsubscribe(this);

        BackValue = message;
        NotifyOfPropertyChange(() => BackValue);
    }
我已经申请了一个属性,比如subscribe(this).name(“”) 传递象令牌一样的东西


谢谢

Eventaggregator将消息作为参数传递给订阅者

因此,您的方法是:

public void Handle(string message)
将收到“添加”或“列表”作为消息参数

该参数可以是您喜欢的任何类型。该类型可以是复杂类型,而不是值类型。事实上,通常最好为要发送的每种类型的消息定义一个类(类型),因为它是区分在引发任何消息时触发哪些处理程序的类型


在任何情况下,若字符串并没有足够的信息,您可以定义一个具有大量属性的类,并以这种方式传递任意多的参数。例如,可以使用具有模式和源属性的类Foo。模式为Add/List,来源为消息的来源。

您可以创建包含消息和发件人信息的自定义类,然后订阅它,而不是订阅一种类型的字符串。比如说,

public class ActionMessage
{
    public object Sender{get;set;}
    public string Message{get;set;}
}
您现在可以将消息发布为

_eventAggregator.PublishOnUIThread(new ActionInvokedMessage { Message = "Add", Sender = this });
此发件人属性将包括邮件的源。您可以在处理事件时验证源的类型

public void Handle(ActionInvokedMessage message)
{
        if(message.Sender is UserControl1ViewModel)
        {

        }

        if(message.Sender is UserControl2ViewModel)
        {

        }
}