2010-10-24 2 views
0

У меня есть DateNavigatorViewModel + DateNavigatorView на моем ButtonBar.Перекрестный огонь с системой Messenger между ViewModels вызывает проблемы

Ниже представлены 2 вида, которые меняются: DailyView и WeeklyView. Каждый вид имеет DailyViewModel и WeeklyViewModel.

В моей DateNavigatorViewModel я имею messenger.Send(SelectedDate);

В моем DailyViewModel и WeeklyViewModel каждый регистр в конструкторе:

messenger.Register<DateTime>(this, LoadDailyData); 
messenger.Register<DateTime>(this, LoadWeeklyData); 

угадать, что происходит, когда я выбрать дату ...

Я использую Инструмент MVVM Light.

Как я могу решить эту проблему получения 2-х разных данных из базы данных?

+0

Как насчет того, чтобы вы не догадывались? – devuxer

+0

Что это значит? Вся информация размещена выше ?? ах ... вы не получите последнее предложение, которое я вижу. Значение DateTime отправляется обоим ViewModels, поэтому я получаю данные дважды ... не так ли? – Elisabeth

ответ

0

На вашем уровне доступа к данным вы можете использовать кеширование, хранящееся в каком-то статическом словаре, загружать все данные, необходимые из базы данных, для просмотра и фильтрации на уровне данных для отдельных видов.

Или, альтернативно, прием данных DateChanged должен приниматься объектами Data, загружать данные, а затем иметь второе сообщение, поднятое и принятое двумя вашими представлениями.

+0

первый из них не работает для моего сценария, так как производительность будет слишком медленной, выкладывая/кадрируя календарь ... Можете ли вы объяснить второе предложение немного больше, я не понимаю, что вы имеете в виду. Спасибо! – Elisabeth

+0

Я не вижу, как будет влиять производительность, кроме небольшого увеличения использования памяти для кеширования. Вторая идея заключается в том, чтобы ваш слой данных отвечал на запрос данных, затем загружал данные и поднимал второе сообщение, полученное вашими ViewModels, с данными, передаваемыми в качестве параметра сообщения. Поэтому вы загружаете данные только один раз, но передавайте их, чтобы получать несколько ViewModels. – benPearce

+0

Либо я был неясен, либо неправильно понял мой сценарий. О штрафе за производительность: когда я нажимаю кнопку moveNextDate atm, я получаю прямо сейчас 10 строк, умноженных на 2 RichTextBoxcolumns. Это занимает время в секунду. Еще одна задержка в загрузке, и мне нужен индикатор выполнения ... – Elisabeth

0

MainViewModel конкретизируется затем:

нажав на Daily-Button инстанцирует:

public DailyViewModel(IMessenger messenger) 
     { 
      _messenger = messenger; 
      _messenger.Register<DateNavigatorInfoObject>(this, LoadDailyData); 

     } 

     private void LoadDailyData(DateNavigatorInfoObject infoObject) 
     { 
      if (infoObject.DateNavigatorMode != DateTest.DateMode.Day) 
       return; 

      // get daily database stuff 
     } 

После DateNavigatorViewModel получил экземпляр см НИЖЕ

мыши на Еженедельная кнопка instantiat Э.С.:

public WeeklyViewModel(IMessenger messenger) 
{ 
    _messenger = messenger; 
    _messenger.Register<DateNavigatorInfoObject>(this, LoadWeeklyData);     
} 

private void LoadWeeklyData(DateNavigatorInfoObject infoObject) 
{ 
    if (infoObject.DateNavigatorMode != DateTest.DateMode.Week) 
     return; 

    // get weekly database stuff 
} 

После DateNavigatorViewModel получил экземпляр см НИЖЕ

public DateNavigatorViewModel(IMainRepository mainRepo, IMessenger messenger) 
     { 
      _mainRepo = mainRepo; 
      _messenger = messenger; 

      SelectedDate = DateTime.Now; 
      // Wether daily/weekly data is fetched the start date for the data is NOW // when the ViewModels are instantiated the first time using a ViewModelLocator... 
     } 

Теперь свойство, что был уволен установки DateTime.Now в CTOR

private DateTime _selectedDate; 
     public DateTime SelectedDate 
     { 
      get { return _selectedDate; } 
      set 
      { 
       if (_selectedDate.Date == value.Date) 
        return; 

       _selectedDate = value; 
       this.RaisePropertyChanged("SelectedDate"); 


       var infoObject = new DateNavigatorInfoObject(); 
       switch (DateNavigatorMode) 
       {  
        case DateTest.DateMode.Day: 
         infoObject.DateNavigatorMode = DateNavigatorMode; 
         infoObject.SelectedStartDate = value; 
         break; 

        case DateTest.DateMode.Week: 
         infoObject.DateNavigatorMode = DateNavigatorMode; 
         infoObject.SelectedStartDate = value; 
         infoObject.SelectedEndDate = value.AddDays(6); 
         break; 
       } 

       _messenger.Send(infoObject);     
      } 

public class DateTest 
    { 
     public enum DateMode 
     { 
      Day, 
      Week, 
      Month, 
     } 
    } 

The infoObject отправляется как в Daily, так и WeeklyViewModel, но в зависимости от DateNavigatorMode Извлечение базы данных отклоняется из ViewModel.

Для меня это решение, потому что оно сначала работает, а во-вторых, DAL участвует только в ViewModels.

Кто-то может отметить это как решение, если вам оно нравится. Критики тоже приветствуются, может быть, я могу что-то улучшить?

+0

ok забудьте о том, что решение я выложу завтра лучше :) меньше кода меньше hackstyle: P – Elisabeth

+0

назад ... поскольку я изменил свои требования, ежедневный и еженедельный просмотр имеет теперь все разные кнопки, не то же самое datepicker и т. Д., Кроме один пользовательский контроль с 5 кнопками. Так что больше не нужно искать подходящий алгоритм. Но все же спасибо за помощь всем выше всего Бена. – Elisabeth

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