繁体   English   中英

wpf mvvmlight将数据传递到viewmodel

[英]wpf mvvmlight passing data to viewmodel

我有以下视图和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。 那会是更好的方法吗?

简单的方法

简单的方法是您正在做的事情,但是也许更好的解决方案是创建一个staticsingleton类,例如NavigationParameterContainer并将选定的StaffMember存储在公共属性中。 然后可以在NotesViewModel检索它

最佳实践

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

MVVMLight不支持此功能,因此您可以使用Prism等不同的框架,或者自己编写可用于进行参数化导航的架构。

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

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

导航时,调用服务上的Navigate方法,并将所选项目作为参数传递。 然后,您需要在服务中进行实际的导航,导航完成后,如果ViewModel实现了INavigationAware接口,则在ViewModel上调用OnNavigatedTo回调。 (您可以从Page.DataContext VM,并将其Page.DataContextINavigationAware如果它不为null,则可以调用OnNavigatedTo )。

最后,在NotesViewModel中,您只需要实现INavigationAware接口,并处理在OnNavigatedTo方法中收到的参数。

这只是基本思想,但我强烈建议您查看已经实现了该功能的某些MVVM框架。 (如PrismLibrary )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM