我有以下视图和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。这会是一个更好的方法吗?
答案 0 :(得分:1)
简单方法
简单的方法是你正在做的事情,但也许更好的解决方案是创建一个static
或singleton
类,如NavigationParameterContainer
并存储选定的StaffMember
在公共财产。然后,您可以在NotesViewModel
最佳做法
在ViewModels
之间传递数据的更好解决方案是使用自定义导航服务和导航识别ViewModels
。
MVVMLight不支持这一点,所以要么使用像Prism这样的不同框架,要么自己编写一个可用于制作参数化导航的架构。
基本思想是创建一个INavigationAware
接口,支持导航生命周期回调,如OnNavigatedTo
,它接收代表NavigationParamter
的对象(选定的StaffMember)。
然后使用NavigationService
方法创建某种Navigate
,接受一些参数来确定要导航到的Page
,并object
是NavigationParamter
Navigate
。
导航时,请在服务上调用OnNavigatedTo
方法,并将所选项目作为参数传递。然后,您需要在服务中进行实际导航,导航完成后,如果正在实施ViewModel
界面,则会调用INavigationAware
上的Page.DataContext
回调。 (您可以从INavigationAware
检索VM并将其转换为OnNavigatedTo
如果它不为空,则可以调用INavigationAware
)。
最后在NotesViewModel中,您只需实现OnNavigatedTo
接口,并处理您在Mono<Void> bind(BindServiceInstanceRequest request)
方法中收到的参数。
这只是基本的想法,但我强烈建议您看一些已经实现此功能的MVVM框架。 (如PrismLibrary)。