在Prism-App (WPF)中传递参数出错



在我的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。

相关内容

  • 没有找到相关文章

最新更新