2014-01-24 3 views
3

Извиняюсь, если это действительно глупый вопрос, но я просто начать работу с caliburn.micro и я изо всех сил с получением eventAggregator, ничего, кажется, подписавшись ...Caliburn.Micro EventAggregator

Я не уверен, проблема с моделью просмотра или загрузчиком. Вот ViewModel:

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); 
    } 
} 

Bootstrapper:

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 как Контейнер МОК

EDIT:

Это кажется очень простой случай I d Не знаю, что я делаю. RTFM.

Реализация IHandle действительно работает. Кажется, что он дважды появляется в первый раз, когда обрабатывается тип. Я расскажу вам, почему.

ответ

0

Пример микро-документа caliburn показывает, что абонент должен реализовать интерфейс IHandle. Я думаю, что это проблема.

+0

Я пробовал это с использованием двух экземпляров интерфейса IHandle. Как 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; 
    } 
} 
Смежные вопросы