2014-01-24 75 views
3

道歉,如果這真是愚蠢的問題,但我剛開始接觸caliburn.micro,我剛剛接到eventAggregator掙扎,似乎沒有什麼可以訂閱...Caliburn.Micro EventAggregator

我不確定問題是否與視圖模型或引導程序相關。這裏是視圖模型:

class MainWindowViewModel : Screen 
{ 
    private readonly IEventAggregator _eventAggregator; 

    public MainWindowViewModel(IEventAggregator eventAggregator) 
    { 
     _eventAggregator = eventAggregator; 
     _eventAggregator.Subscribe(this); 
    } 

    public void SayHello() 
    { 
     _eventAggregator.Publish("Hello World!"); 
    } 

    public void Handle(string message) 
    { 
     MessageBox.Show(message); 
    } 
} 

引導程序:

class AppBootstrapper : Bootstrapper<MainWindowViewModel> 
{ 
     public static readonly Container ContainerInstance = new Container(); 

    protected override void Configure() 
    { 
     ContainerInstance.Register<IWindowManager, WindowManager>(); 
     ContainerInstance.RegisterSingle<IEventAggregator,EventAggregator>(); 
     ContainerInstance.Register<MainWindowViewModel, MainWindowViewModel>(); 

     ContainerInstance.Verify(); 
    } 

    protected override IEnumerable<object> GetAllInstances(Type service) 
    { 
     return ContainerInstance.GetAllInstances(service); 
    } 

    protected override object GetInstance(System.Type service, string key) 
    { 
     return ContainerInstance.GetInstance(service); 
    } 

    protected override void BuildUp(object instance) 
    { 
     ContainerInstance.InjectProperties(instance); 
    } 
} 

任何想法,我缺少的是什麼,我覺得我不能在某處連接...

我使用SimpleInjector作爲IOC容器

編輯:

這似乎是一個很簡單的情況下I D我不知道我在做什麼。 RTFM。

實施IHandle確實有效。它似乎在第一次處理類型時被調用兩次。我會做一些調查,爲什麼。

回答

0

caliburn micro doc示例顯示用戶必須實現IHandle接口。我認爲這是問題。

+0

我試過這個與IHandle接口的2個實例。 IHandle和IHandle都是。沒有效果。 –

+0

和'SayHello'被叫?你有沒有設置一個斷點? – csteinmueller

+0

它確實被調用和斷點。雖然我以前犯過一個錯誤。實現'IHandle '確實有效(儘管第一次發佈被稱爲'Handle'被調用兩次),但是'IHandle'什麼也不做。 –

6

這聽起來像你已經到達了各種解決方案。

我相信它應該工作,只要您使用與您即將發佈的兼容類型實現IHandle<T>界面。例如:

class MainWindowViewModel : Screen, IHandle<string> 
{ 
    //... Your Code 

    public void Handle(string myEventstring) 
    { 
     // Do Something. 
    } 
} 

如果在所有有用的,當我使用EventAggregator,我傾向於創建一個靜態EventAggregator實例(從一個小的輔助類),我在任何需要它ViewModels使用 - 它可能的情況下幫助你實際上已經多次意外初始化了EventAggregator(可能是你的雙倍事件的原因)。

我也有時創建小助手類來包裝事件信息。例如:

public sealed class DownloadFinishedEvent 
{ 
    public readonly string EventText = "Download Completed"; 

    // Additional Download Info Here. 

    public override string ToString() 
    { 
     return this.EventText; 
    } 
}