двумя основными способами, которые я делаю это:
1) Используйте посланному:
Sender Класс:
public class TrafficLight
{
public string Color{get;set;}
public TimeSpand Duration{get;set;}
}
public class TrafficLightService
{
public void SendLight(TrafficLight light)
{
Messenger.Default.Send(light);
}
}
Приемник:
public class MyViewModel
{
public MyViewModel()
{
Messenger.Default.Register<TrafficLight>(DoSomethingWithTrafficLight);
}
private void DoSomethingWithTrafficLight(TrafficLight light)
{
}
}
Что здесь происходит что исходный объект использует Messenger в качестве брокера событий. Объекту A не нужно знать об объекте B, им просто нужно знать о посланнике.
2)
Просто используйте инъекции зависимостей:
public class TrafficLight
{
public string Color{get;set;}
public TimeSpand Duration{get;set;}
}
public class LightEventArgs:EventArgs
{
public LightEventArgs(TrafficLight light)
{
_light=light;
}
public TrafficLight Light{get{return _light;}}
}
public interface ITrafficLightService
{
void SendLight(TrafficLight light);
public event EventHandler<LightEventArgs> TrafficLightSet;
}
public class TrafficLightService
{
public void SendLight(TrafficLight light)
{
Messenger.Default.Send(light);
}
public event EventHandler<LightEventArgs> TrafficLightSet;
}
public class TrafficLightSenderViewModel
{
public TrafficLightSenderViewModel(ITrafficLightService trafficLightService)
{
_trafficLightService=trafficLightService;
_trafficLightService.Send(new TrafficLight{Color="Red"});
}
}
public class TrafficLightReceiverViewModel
{
public TrafficLightReceiverViewModel(ITrafficLightService trafficLightService)
{
_trafficLightService=trafficLightService;
_trafficLightService.TrafficLightSet+= TrafficLightNotification;
}
private void TrafficLightNotification(TrafficLightEventArgs args)
{
DoSomethingWithTheLight(args.Light);
}
}
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<ITrafficLightService, Design.TrafficLightService>();
}
else
{
SimpleIoc.Default.Register<ITrafficLightService, TrafficLightService>();
}
SimpleIoc.Default.Register<TrafficLightSenderViewModel>();
SimpleIoc.Default.Register<TrafficLightReceiverViewModel>();
}
public MainViewModel Sender
{
get { return SimpleIoc.Default.GetInstance<TrafficLightSenderViewModel>(); }
}
public MainViewModel Receiver
{
get { return SimpleIoc.Default.GetInstance<TrafficLightReceiverViewModel>(); }
}
}
Это является большим примером и более сложным.
Давайте ходить через этот шаг за шагом:
- В MVVM Light мы используем ViewModelLocator 2 вещи: 1) Для того, чтобы зарегистрировать все наши ViewModels и услуги.
- Обеспечить способ, чтобы позволить View, чтобы получить ViewModel в XAML
Когда мы пытаемся разрешить ViewModel
SimpleIoc.Default.GetInstance<TrafficLightReceiverViewModel>();
SimpleIoc смотрит, имеет ли ViewModel какие-либо зависимости. В нашем случае мы нуждаемся в ITrafficLightService для обеих моделей viewmodels. Что происходит, так это то, что SimpleIoc видит, может ли он разрешить этот класс и проверяет, имеет ли ITrafficLightService какие-либо зависимости, которые также нуждаются в разрешении.Если SimpleIoc может разрешить цепочку зависимостей, необходимых для создания экземпляра вашей модели просмотра, она делает это, а затем возвращает полностью построенный объект.
Ничего себе не думал, что путь зависимости будет так долго? И это теперь предпочтительный способ ????? У меня много вопросов, но в это время я не могу скомпилировать ваш код до тех пор, пока я буду ждать вопросов. Я получаю Тип «MvvmLight1.Model.LightEventArgs» не может использоваться как параметр типа «TEventArgs» в родовом типе или методе «System.EventHandler». Нет никакого неявного преобразования ссылок из «MvvmLight1.Model.LightEventArgs» в «System.EventArgs». –
xiao
LightEventArgs необходимо наследовать от EventArgs. DI - мой предпочтительный способ, потому что он дает ряд преимуществ: легко выполнить модульный тест, он дает мне набор повторно используемых компонентов, и я не скрываю никаких зависимостей, которые имеет класс. Если я быстро удалю приложение (утилита/и т. Д.), Я буду использовать метод 1. Для приложения с будущим я использую метод 2, потому что он значительно удобнее обслуживать и тестировать. –
Я попробую и посмотрю, как это работает. Я просто был удивлен, что вам нужно использовать события, и подумал, что это будет больше вводить модели вместо этого через конструктор или что-то в этом роде. – xiao