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

在您的数据访问层中,您可以使用存储在某个静态字典中的缓存,从数据库中加载您需要的所有数据,以便在数据层为各个视图模型进行视图和过滤器。

或者,让 Data 对象接收 DateChanged 消息,加载数据,然后让您的两个视图引发和接收第二条消息。

于 2010-10-24T21:27:14.607 回答
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...
        }

现在被触发的属性在 Tor 中设置 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 和 WeeklyViewModel,但取决于 DateNavigatorMode,ViewModel 拒绝数据库获取。

对我来说,这是一个解决方案,因为它首先有效,其次没有 DAL 只涉及 ViewModel。

如果您喜欢,有人可能会将其标记为解决方案。也欢迎批评,也许我还能改进一些东西?

于 2010-10-26T19:27:39.137 回答