2010-10-24 53 views
0

我的ButtonBar上有一個DateNavigatorViewModel + DateNavigatorView。ViewModels與Messenger系統交叉火災導致問題

以下是被替換的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 2010-10-24 20:47:52

+0

你是什麼意思?所有信息都張貼在上面?啊......你看不到我看到的最後一句話。 DateTime的值發送給兩個ViewModels,所以我得到的數據兩次......不是很酷嗎? – Elisabeth 2010-10-24 20:55:25

回答

0

在您的數據訪問層中,您可以使用存儲在某個靜態字典中的高速緩存,從單個視圖模型的數據層的視圖和過濾器的數據庫中加載所需的所有數據。

或者一個替代方案,讓Data對象接收DateChanged消息,加載數據,然後在您的兩個視圖中引發和接收第二條消息。

+0

第一個沒有爲我的場景工作,因爲性能會太慢,無法重新開始/返回日曆......你能否再解釋一下第二個建議,我不明白你的意思。謝謝! – Elisabeth 2010-10-24 21:32:31

+0

我看不到性能如何受到影響,除了緩存內存使用量的小幅增加外。第二個想法是讓您的數據層響應數據請求,然後加載數據並引發由ViewModels接收的第二條消息,並將數據作爲消息參數傳遞。因此您只加載一次數據,但將其傳遞給多個ViewModel。 – benPearce 2010-10-25 07:28:07

+0

要麼我不清楚,要麼你誤解我的情況。關於性能損失:當我點擊moveNextDate按鈕atm時,我得到10行乘以2個RichTextBoxcolumns。這需要一秒鐘的時間。任何更多的加載延遲,我需要一個進度條... – Elisabeth 2010-10-25 17:53:58

0

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得到實例看低於

點擊每週按鈕 instantiat ES的:

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

現在被解僱了在構造函數

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

的設置DateTime.Now屬性infoObject發送給Daily和WeeklyViewModel,但取決於DateNavigatorMode數據庫抓取從ViewModel中被拒絕。

對我來說這是一個解決方案,因爲它第一次工作,第二沒有DAL只涉及ViewModels。

有人可能會標記爲解決方案,如果你喜歡它。批評者也歡迎,也許我仍然可以改進一些東西?

+0

好吧忘了那個解決方案我會明天發佈一個更好的:)少少代碼少hackstyle:P – Elisabeth 2010-10-26 21:08:19

+0

回來......因爲我已經改變了我的要求每天和每週的看法現在有所有不同的按鈕,不同日期選擇器等...除一個用戶控制5個按鈕。所以不再需要搜索適當的算法。但是,首先還是要感謝Ben的幫助。 – Elisabeth 2010-10-29 18:37:13