在我的prism应用程序(WPF)中,我有一个视图模型,它将参数传递给另一个视图模型,让我们称之为MyViewModel。我已经实现了BindableBase类和INavigationAware接口。所以我的视图模型看起来是这样的(为了这个问题的目的而简化)。
class MyViewModel : BindableBase, INavigationAware
{
private IRegionManager _regionManager;
private ObservableCollection<MyClass> _myClassCollection;
private string _myParameter;
private NavigationParameters _navigationParameters = new NavigationParameters();
public ObservableCollection<MyClass> MyClassCollection => _myClassCollection;
public MyViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
_myClassCollection = GetMyClassData(_myParameter);
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
_myParameter = navigationContext.Parameters.GetValue<string>("MyPassedParameter");
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
}
我可以看到mypasssedparameter在OnNavigatedTo方法中按预期传递。问题是,要在此视图模型的相应视图中显示的数据的提取- GetMyClassData -取决于此参数。由于构造函数在OnNavigatedTo之前运行,所以当我在构造函数中使用_myParameter时,它的值为null。
谁能告诉我如何在视图模型的数据提取中使用传递的参数?
提前感谢。
如果您打算将_myClassCollection
设置为GetMyClassData(_myParameter)
,那么在获得_myParameter
之前这样做是没有意义的,因此您应该将初始化逻辑移动到OnNavigatedTo
方法:
public MyViewModel(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
_myParameter = navigationContext.Parameters.GetValue<string>("MyPassedParameter");
_myClassCollection = GetMyClassData(_myParameter);
}
_myParameter
是一个导航参数,在构造视图模型时不存在。
由于构造函数在OnNavigatedTo之前运行,所以当我在构造函数中使用_myParameter时,它的值为null。
这是Prism导航概念的一个基本限制。视图模型定位器创建未初始化的视图模型,即处于(否则)非法状态。它在第一次导航时生效。
你可以接受这一点,让你的视图模型支持未初始化状态(例如,删除get-only auto-properties),并在导航到时加载所有内容。
或者您可以放弃Prism对该视图模型的导航,自己创建视图模型并将其链接到数据模板("视图模型优先")。Prism的早期版本实际上支持导航到视图模型(而不是视图),但是您总是可以将ContentControl
绑定到包含视图模型的属性上,并使用DataTenmplate
来显示子视图模型。
或者您可以创建自己的RegionNavigationService
,支持创建参数化视图模型。参见github。