2013-08-06 2 views
0

Я не понимаю, как передавать данные в другие виды. Я собрал 3 способа сделать это, но я не уверен, как сделать 2 из них.Как передавать данные в разные виды в MVVM Light?

  1. Отправка данных через посыльного (не уверен, если вы можете отправить объекты в противном случае я могу видеть, что становится довольно неаккуратно, если вы должны отправить как 10 штук данных или что-то подобное вместе).

  2. Как-то передают данные через конструктор новой модели. Я говорю «как-то», так как неясно, как это сделать при использовании контейнера IOC (в этом случае встроенного).

  3. Передача данных через параметр. Я видел пару учебных пособий, которые показывают, как делать навигацию для телефона Windows, но никто не говорит о передаче параметров. Я предполагаю, что это все равно будет вариантом.

Из того, что я слышал, является то, что Вариант 1 - это своего рода старый способ сделать это. Вариант 2 кажется более новым и более эффективным способом сделать это, но я не могу найти примеров для людей, показывающих, как это сделать.

Я не знаю, как это сделать, потому что Ioc должен создавать экземпляр представления, так как вы передаете ему данные, когда эти данные не существуют?

ответ

2

двумя основными способами, которые я делаю это:

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

Это является большим примером и более сложным.

Давайте ходить через этот шаг за шагом:

  1. В MVVM Light мы используем ViewModelLocator 2 вещи: 1) Для того, чтобы зарегистрировать все наши ViewModels и услуги.
  2. Обеспечить способ, чтобы позволить View, чтобы получить ViewModel в XAML

Когда мы пытаемся разрешить ViewModel

SimpleIoc.Default.GetInstance<TrafficLightReceiverViewModel>(); 

SimpleIoc смотрит, имеет ли ViewModel какие-либо зависимости. В нашем случае мы нуждаемся в ITrafficLightService для обеих моделей viewmodels. Что происходит, так это то, что SimpleIoc видит, может ли он разрешить этот класс и проверяет, имеет ли ITrafficLightService какие-либо зависимости, которые также нуждаются в разрешении.Если SimpleIoc может разрешить цепочку зависимостей, необходимых для создания экземпляра вашей модели просмотра, она делает это, а затем возвращает полностью построенный объект.

+0

Ничего себе не думал, что путь зависимости будет так долго? И это теперь предпочтительный способ ????? У меня много вопросов, но в это время я не могу скомпилировать ваш код до тех пор, пока я буду ждать вопросов. Я получаю Тип «MvvmLight1.Model.LightEventArgs» не может использоваться как параметр типа «TEventArgs» в родовом типе или методе «System.EventHandler ». Нет никакого неявного преобразования ссылок из «MvvmLight1.Model.LightEventArgs» в «System.EventArgs». – xiao

+0

LightEventArgs необходимо наследовать от EventArgs. DI - мой предпочтительный способ, потому что он дает ряд преимуществ: легко выполнить модульный тест, он дает мне набор повторно используемых компонентов, и я не скрываю никаких зависимостей, которые имеет класс. Если я быстро удалю приложение (утилита/и т. Д.), Я буду использовать метод 1. Для приложения с будущим я использую метод 2, потому что он значительно удобнее обслуживать и тестировать. –

+0

Я попробую и посмотрю, как это работает. Я просто был удивлен, что вам нужно использовать события, и подумал, что это будет больше вводить модели вместо этого через конструктор или что-то в этом роде. – xiao

Смежные вопросы