无法在 Prism-App (WPF) 中传递参数
Trouble passing parameters in Prism-App (WPF)
在我的 Prism 应用程序 (WPF) 中,我有一个将参数传递给另一个视图模型的视图模型,我们称之为 MyViewModel。我已经实现了 BindableBase class 和 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)
{
}
}
我可以看到 MyPassedParameter 在 OnNavigatedTo 方法中按预期传递。问题是,要在此视图模型的相应视图中显示的数据提取 - GetMyClassData - 取决于此参数。由于构造函数在 OnNavigatedTo 之前运行,因此当我在构造函数中使用它时,_myParameter 的值为 null。
谁能告诉我如何在视图模型的数据提取中使用传递的参数。
提前致谢。
Since the contructor runs before OnNavigatedTo, _myParameter has value null when I am using it in the constructor.
这是 Prism 导航概念的根本限制。视图模型定位器创建未初始化的视图模型,即处于(否则)非法状态。它在第一次导航时生效。
您可以忍受这一点并让您的视图模型支持未初始化状态(例如,删除只获取自动属性)并在您导航到时加载所有内容。
或者您可以删除 Prism 的此视图模型导航并自行创建视图模型,然后 link 将其添加到数据模板(“首先查看模型”)。 Prism 的早期版本实际上支持导航到视图模型(而不是视图),但您始终可以将 ContentControl
绑定到包含视图模型上的 属性,并使用 DataTenmplate
绑定到显示子视图模型。
或者您可以创建自己的 RegionNavigationService
来支持创建参数化视图模型。在 github 看到这个 issue。
如果您打算将 _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
是构建视图模型时不存在的导航参数。
在我的 Prism 应用程序 (WPF) 中,我有一个将参数传递给另一个视图模型的视图模型,我们称之为 MyViewModel。我已经实现了 BindableBase class 和 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)
{
}
}
我可以看到 MyPassedParameter 在 OnNavigatedTo 方法中按预期传递。问题是,要在此视图模型的相应视图中显示的数据提取 - GetMyClassData - 取决于此参数。由于构造函数在 OnNavigatedTo 之前运行,因此当我在构造函数中使用它时,_myParameter 的值为 null。
谁能告诉我如何在视图模型的数据提取中使用传递的参数。
提前致谢。
Since the contructor runs before OnNavigatedTo, _myParameter has value null when I am using it in the constructor.
这是 Prism 导航概念的根本限制。视图模型定位器创建未初始化的视图模型,即处于(否则)非法状态。它在第一次导航时生效。
您可以忍受这一点并让您的视图模型支持未初始化状态(例如,删除只获取自动属性)并在您导航到时加载所有内容。
或者您可以删除 Prism 的此视图模型导航并自行创建视图模型,然后 link 将其添加到数据模板(“首先查看模型”)。 Prism 的早期版本实际上支持导航到视图模型(而不是视图),但您始终可以将 ContentControl
绑定到包含视图模型上的 属性,并使用 DataTenmplate
绑定到显示子视图模型。
或者您可以创建自己的 RegionNavigationService
来支持创建参数化视图模型。在 github 看到这个 issue。
如果您打算将 _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
是构建视图模型时不存在的导航参数。