Перекрестный пожар с системой Messenger между ViewModels вызывает проблемы - PullRequest
0 голосов
/ 25 октября 2010

У меня есть DateNavigatorViewModel + DateNavigatorView на моей кнопочной панели.

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

В моем DateNavigatorViewModel у меня есть messenger.Send(SelectedDate);

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

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

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

Я использую MVVM Light toolkit.

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

Ответы [ 2 ]

0 голосов
/ 26 октября 2010

MainViewModel создается тогда:

нажатие на Ежедневная кнопка создает экземпляр:

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, см. НИЖЕ

нажатие на Еженедельная кнопка создает экземпляр:

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,
        }
    }

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

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

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

0 голосов
/ 25 октября 2010

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

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

...