2013-03-04 4 views
0

У меня есть кнопка на моем AppBar для «Синхронизировать все». Это вызывает веб-сервис для каждого провайдера и обновляет данные, которые были кэшированы. После обновления мне нужно обновить данные выбранных поставщиков на экране, поэтому как мне это сделать с помощью mvvm-light.Messenger Class - Can AppBar Нажмите кнопку, чтобы обновить экран

1) Когда я пытаюсь получить доступ к данным одним нажатием кнопки, я не уверен, как получить доступ к загружаемым в настоящее время моделях просмотра, чтобы обновить данные позади них. Есть ли способ получить доступ к модели представления из события клика и обновить базовые данные.

2) Мне интересно, для чего используется класс мессенджера, и если да, то есть ли хорошие примеры, на которые я могу посмотреть, использовать эту функцию, когда пользователь нажимает кнопку «Синхронизировать все».

3) Если класс мессенджера не является таким способом, и нет способа получить доступ к текущей модели представления, какие у меня есть другие параметры.

Любая помощь будет оценена по достоинству.

ответ

1

У вас есть два способа сделать это:

  1. Использование мессенджер
  2. Использование стандартных событий

Вариант 1 работает в значительной степени независимо от вашего дизайна и выходит что-то вроде этого:

  1. Пользователь нажимает кнопку вашего AppBar, которая вызывает команду
  2. Команда вызывает службу, которая внутренне вызывает ваш веб-сервис (хороший способ), или команда просто вызывает ваш веб-сервис (это не так приятно). Я ожидаю, что этот метод будет асинхронным методом.
  3. После того, как вы получили новые данные, вы вызываете Messenger.Default.Send() для трансляции всех режимов просмотра, которые они должны обновлять.

Код:

ViewModel:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Messenger.Default.Register<DataRefreshEvent>(this,ReceiveDataRefreshEvent); 
    } 

    private void ReceiveDataRefreshEvent(DataRefreshEvent obj) 
    { 
     //do what you need to do 
    } 
} 

Услуги:

public class Service 
{ 
    public async void RefreshData() 
    { 
     await _webService.RefreshDataAsync(); 
     Messenger.Default.Send(new ReceiveDataRefreshEvent()); 
    } 

} 

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

  1. Пользователь нажимает на кнопку AppBar, которая вызывает команду
  2. Команда вызывает службу, которая, внутренне вызывает ваш WebService (славный путь) или команды просто вызывает ваш WebService (не столь хороший путь). Я ожидаю, что этот метод будет асинхронным методом.
  3. Служба вызывает стандартное событие, позволяющее подписанным режимам просмотра знать, что им необходимо обновить свои данные. Таким образом, в основном такой же, как и вариант 1, за исключением того, что каждая модель просмотра является активом, подписывающимся на событие на службе, а не на событие обмена сообщениями.

Код:

ViewModel:

public class ViewModel 
{ 
    public ViewModel(IService service) 
    { 
     service.DataChanged+=ReceiveDataRefreshedEvent; 
    } 

    private void ReceiveDataRefreshEvent(sender obj,EventArgs args) 
    { 
     //do what you need to do 
    } 
} 

Услуги:

public class Service:IService 
{ 
    public event EventHandler ReceiveDataRefreshedEvent; 
    public async void RefreshData() 
    { 
     await _webService.RefreshDataAsync(); 
     if(ReceiveDataRefreshedEvent!=null) 
      ReceiveDataRefreshedEvent(this,EventArgs.Empty); 
    } 

} 

Вариант 1 хорошо, потому что вы не должны передать ссылку на службу к ViewModel. Это красиво де-подключено.

Если вы не уверены в возможности использования обмена сообщениями 2.

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