无法在 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 是构建视图模型时不存在的导航参数。