wpf mvvmlight将数据传递给viewmodel

时间:2017-03-15 20:11:32

标签: c# wpf xaml mvvm

我有以下视图和viewModels视图:Staff,VM:StaffViewModel和View:Notes,VM:NotesViewModel。

我的StaffViewModel具有SelectedEmployee类型的SelectedStaffMember属性。

“职员”视图有一个按钮,可以启动另一个视图(注释)。

当用户输入注释时,我需要将其保存到SelectedEmployee,这意味着NotesViewModel需要知道当前选择的员工ID。

现在我通过我的ViewModelLocator这样做,但这似乎是错误的,将数据传递给VM的正确方法是什么?

我正在使用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 Flyouts显示添加注释的视图: 这是显示视图的地方,它是从MainView.xaml而不是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 个答案:

答案 0 :(得分:1)

简单方法

简单的方法是你正在做的事情,但也许更好的解决方案是创建一个staticsingleton类,如NavigationParameterContainer并存储选定的StaffMember在公共财产。然后,您可以在NotesViewModel

中检索它

最佳做法

ViewModels之间传递数据的更好解决方案是使用自定义导航服务和导航识别ViewModels

MVVMLight不支持这一点,所以要么使用像Prism这样的不同框架,要么自己编写一个可用于制作参数化导航的架构。

基本思想是创建一个INavigationAware接口,支持导航生命周期回调,如OnNavigatedTo,它接收代表NavigationParamter的对象(选定的StaffMember)。

然后使用NavigationService方法创建某种Navigate,接受一些参数来确定要导航到的Page,并objectNavigationParamter Navigate

导航时,请在服务上调用OnNavigatedTo方法,并将所选项目作为参数传递。然后,您需要在服务中进行实际导航,导航完成后,如果正在实施ViewModel界面,则会调用INavigationAware上的Page.DataContext回调。 (您可以从INavigationAware检索VM并将其转换为OnNavigatedTo如果它不为空,则可以调用INavigationAware)。

最后在NotesViewModel中,您只需实现OnNavigatedTo接口,并处理您在Mono<Void> bind(BindServiceInstanceRequest request)方法中收到的参数。

这只是基本的想法,但我强烈建议您看一些已经实现此功能的MVVM框架。 (如PrismLibrary)。