2017-03-15 259 views
0

我有以下視圖和viewModels視圖:Staff,VM:StaffViewModel和View:Notes,VM:NotesViewModel。wpf mvvmlight將數據傳遞給viewmodel

我的StaffViewModel具有SelectedEmployee類型的SelectedStaffMember屬性。

工作人員視圖有一個啓動另一個視圖(注)的按鈕。

當用戶輸入筆記時,我需要將其保存爲SelectedEmployee,這意味着NotesViewModel需要知道當前選定的員工ID。

現在通過我的ViewModelLocator做到這一點,但這似乎是錯誤的,什麼是將數據傳遞給虛擬機的相關方式?

我正在使用MVVM Light。

相關的代碼 - StaffViewModel

public Employee SelectedEmployee 
    { 
     get { return _selectedEmployee; } 
     set 
     { 
      if (value == _selectedEmployee) return; 
      _selectedEmployee = value; 
      HolidayAllowance = _staffDataService.GetEmployeeHolidayAllowance(_selectedEmployee.Id); 
      RaisePropertyChanged(); 
      RaisePropertyChanged(nameof(HolidayAllowance)); 
     } 
    } 

NoteViewModel

public RelayCommand SaveNoteCommand { get; private set; } 

private void SaveNote() 
{ 
    var note = new Note 
    { 
     NoteContent = NoteContent, 
     EmployeeId = ViewModelLocator.Staff.SelectedEmployee.Id, 
     NoteDate = NoteDate 
    }; 

    _dataService.SaveNote(note); 
} 

我使用MahApps彈出按鈕來顯示添加備註的觀點: 這是顯示的視圖,其啓動MainView.xaml NOT Staff.xaml,我認爲這將是另一個獲得SelectedEmployee ID的問題:

MainView.xaml

<controls:Flyout Name="AddNoteFlyout" 
       Header="Add Note" 
       IsModal="True" 
       IsOpen="{Binding IsAddNoteOpen}" 
       Opacity="85" 
       Position="Right" 
       Width="450"> 
       <views:AddNote VerticalAlignment="Top" Margin="0,30,0,0"/> 
</controls:Flyout> 

即時考慮發射一個消息的按鈕點擊啓動視圖,我的工作人員的觀點將註冊。該消息將包含selectedEmployeeId。這是更好的方法嗎?

回答

1

最簡單的方法

簡單的方法是你在做什麼,但也許好一點的解決方案是創建一個staticsingleton類像NavigationParameterContainer和存儲選擇StaffMember的公共財產。然後你就可以在你的NotesViewModel

最好的做法

檢索它ViewModels之間傳遞數據時使用自定義的導航服務,導航意識到ViewModels更好的解決方案。

MVVMLight不支持這個,所以要麼你使用Prism之類的不同框架,要麼寫一個你可以用來製作參數化導航的體系結構。

基本思想是,您創建一個支持導航生命週期回調的接口INavigationAware,如OnNavigatedTo,它接收表示NavigationParamter(所選職員成員)的對象。

然後創建某種NavigationServiceNavigate方法,接受一些參數來確定Page要定位到和object至極是NavigationParamter

當您導航時,您可以調用服務上的Navigate方法,並將所選項目作爲參數傳遞。然後,您需要在服務中進行實際導航,導航完成後,如果您正在實施INavigationAware界面,請在ViewModel上撥打OnNavigatedTo回叫。 (您可以從Page.DataContext中獲取虛擬機,如果虛擬機不爲空,則可以將其轉換爲INavigationAware,您可以調用OnNavigatedTo)。

最後在你的NotesViewModel你只需要實現INavigationAware接口,並處理您在OnNavigatedTo方法收到的參數。

這只是基本的想法,但我強烈建議你看看已經實現了這個的一些MVVM框架。 (如PrismLibrary)。

相關問題