2017-03-15 260 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)。

相关问题