【问题标题】:Cross fire with Messenger system between ViewModels causes ProblemsViewModels 之间与 Messenger 系统交火导致问题
【发布时间】:2010-10-24 20:40:25
【问题描述】:

我的 ButtonBar 上有一个 DateNavigatorViewModel + DateNavigatorView。

以下是交换的 2 个视图: 每日视图和每周视图。每个 View 都有一个 DailyViewModel 和 WeeklyViewModel。

在我的 DateNavigatorViewModel 我有messenger.Send(SelectedDate);

在我的 DailyViewModel 和 WeeklyViewModel 中,每个寄存器都在构造函数中:

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

猜猜当我选择一个日期时会发生什么......

我正在使用 MVVM Light 工具包。

如何解决从数据库中获取 2 倍数据的问题?

【问题讨论】:

  • 不要让我猜怎么样?
  • 什么意思?所有信息都在上面发布??啊...你没有得到我看到的最后一句话。 DateTime 值被发送到两个 ViewModel,所以我得到了两次数据……不酷吧?

标签: wpf mvvm viewmodel light mediator


【解决方案1】:

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

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

【讨论】:

  • 第一个不适用于我的场景,因为在切换日历时性能会太慢...请您再解释一下第二个建议,我不明白是什么你的意思是。谢谢!
  • 我看不出性能会受到怎样的影响,除了缓存的内存使用量略有增加。第二个想法是让您的数据层响应数据请求,然后加载数据并引发第二条消息,由您的 ViewModel 接收,数据作为消息参数传递。因此,您只需加载一次数据,然后将其传递给多个 ViewModel。
  • 要么我不清楚,要么你误解了我的情况。关于性能损失:当我单击 moveNextDate 按钮 atm 时,我现在得到 10 行乘以 2 RichTextBox 列。这需要一秒钟的时间。加载中的任何延迟,我需要一个进度条...
  • 我想让 DAL 远离这种情况,因为它的应用程序逻辑所以我想在 ViewMODels 中解决它。稍后会发布。
【解决方案2】:

然后实例化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 实例化之后,请参阅BELOW

点击每周按钮会实例化:

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 实例化之后,请参阅BELOW

 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 和 WeeklyViewModel,但根据 DateNavigatorMode,ViewModel 会拒绝数据库获取。

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

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

【讨论】:

  • 好吧,忘记那个解决方案,我明天会发布一个更好的解决方案 :) 少代码少 hackstyle :P
  • 返回...因为我已经更改了每日和每周视图的要求,现在所有不同的按钮,不同的日期选择器等...除了一个带有 5 个按钮的用户控件。所以不再需要寻找合适的算法。但仍然感谢 Ben 的帮助。
猜你喜欢
  • 2018-06-03
  • 2023-03-06
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多