0

ButtonBar に DateNavigatorViewModel + DateNavigatorView があります。

以下は、交換される 2 つのビューです: DailyView と WeeklyView。各ビューには、DailyViewModel と WeeklyViewModel があります。

私のDateNavigatorViewModelにはmessenger.Send(SelectedDate);

私の DailyViewModel と WeeklyViewModel では、それぞれコンストラクターに登録します。

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

日付を選択するとどうなるか...

MVVM Light ツールキットを使用しています。

データベースから2倍のデータを取得するという問題を解決するにはどうすればよいですか?

4

2 に答える 2

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 がインスタンス化された後、以下を参照してください

Weekly-Buttonをクリックすると、以下がインスタンス化されます。

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

Ctor で DateTime.Now を設定して発生したプロパティ

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

infoObject は Daily ViewModel と WeeklyViewModel の両方に送信されますが、DateNavigatorMode によっては、ViewModel からのデータベースのフェッチが拒否されます。

私にとっては、それが最初に機能し、次にDALがViewModelだけに関与していないため、これは解決策です。

気に入ったら、誰かが解決策としてマークするかもしれません。批評家も大歓迎です。何か改善できることはありますか?

于 2010-10-26T19:27:39.137 に答える
0

データ アクセス レイヤーでは、いくつかの静的辞書に格納されているキャッシュを使用し、個々のビューモデルのデータ レイヤーでビューとフィルターの両方に必要なすべてのデータをデータベースから読み込むことができます。

または別の方法として、DateChanged メッセージを Data オブジェクトで受信し、データをロードしてから、2 つ目のメッセージを生成して 2 つのビューで受信します。

于 2010-10-24T21:27:14.607 に答える