如何通过DI将参数传递给新创建的视图

时间:2016-10-20 06:53:19

标签: wpf prism

我对PRISM很新,我不得不说,每天我都越来越喜欢它!目前,我正在努力解决如何将参数传递给新创建的视图(通过依赖注入)的问题。我的情况如下: 用户单击按钮,并在屏幕右侧创建新视图。我这样做,如下:

IRegion region = this._regionManager.Regions [RegionNames.ActionRegion];

 object boxView = region.GetView("BoxDetailsView");
 if (boxView == null)
        {
       boxView = ServiceLocator.Current.GetInstance<BoxDetailsView>();
            region.Add(boxView, "BoxDetailsView");
        }

        region.Activate(boxView);

这很好用。但是,我确实需要将参数传递给该视图,我不知道如何。 OnNavigationFrom&amp; OnNaviagationTo不起作用,因为我没有从MainView导航,我只是打开其他视图。 我确实检查了非常着名的Stock Trader RI,但是,我还没有找到实现它的方法。

我觉得我非常接近,但做了一些小事。有人可以帮忙吗?

谢谢,

<磷>氮

4 个答案:

答案 0 :(得分:1)

我建议使用导航框架。只需使用RequestNavigate并通过方法调用传递参数。然后让您的View / ViewModel实现INavigationAware,然后您就可以访问您传递的参数。

答案 1 :(得分:0)

我也是prism的新手,但在我的项目中,我使用RegionContext将参数作为viewmodel传递给子视图。 (我用Unity来解析视图)

xaml中的

区域(source):

    <TabControl 
    regions:RegionManager.RegionName="{x:Static inf:RegionNames.ServerTabPartRegion}" 
    regions:RegionManager.RegionContext="{Binding CurrentServer, Mode=OneWay}">
    </TabControl>

查看注册(source

    public void Initialize()
    {
        _regionManager.RegisterViewWithRegion(RegionNames.ServerTabPartRegion, CreateView);
    }

    private object CreateView()
    {
        return ServerTabViewHelper.RegisterView<OnlinePlayers, ServerInfo, ServerMonitorPlayerViewModel>(_container,
            "serverInfo");
    }

帮助获取参数(source

public static class ServerTabViewHelper
{
    public static TView RegisterView<TView, TViewParameter, TViewModel>(IUnityContainer container, string parameterName)
        where TView : FrameworkElement where TViewParameter : class
    {
        var view = container.Resolve<TView>();
        var context = RegionContext.GetObservableContext(view);
        context.PropertyChanged += (s, e) =>
        {
            var obs = s as ObservableObject<object>;
            if (obs != null)
            {
                var serverInfo = obs.Value as TViewParameter;
                var vm = container.Resolve<TViewModel>(new ParameterOverride(parameterName, serverInfo));
                view.DataContext = vm;
            }
        };
        return view;
    }
}

答案 2 :(得分:0)

导航时解析视图模型的优点是视图模型始终处于初始化状态(前提是您在导航时可以获得所有数据以防止延迟)。

要使用prism,您必须使用修改后的RegionNavigationService,因为该功能不会包含在框架中(截至目前,请参阅this issue)。

扩展ExecuteNavigation方法:

[...update journal...]

// Create and set the view model based on the navigation context
var viewAsDependencyObject = view as DependencyObject;
if (viewAsDependencyObject != null)
{
    var createViewModelOnNavigateTo = ViewModelLocator.GetCreateViewModelOnNavigateTo( viewAsDependencyObject );
    if (createViewModelOnNavigateTo)
        ViewModelLocator.Bind( view, _viewModelProvider.CreateViewModel( viewAsDependencyObject, navigationContext ) );
}

[...inform view...]

其他变化包括:

  • _viewModelProvider:与ViewModelLocator类似的服务,可以从NavigationContext
  • 创建视图模型
  • CreateViewModelOnNavigate:类似于AutoWireViewModel的附加属性,用于标记在导航到它时应接收新创建的视图模型的视图

答案 3 :(得分:0)

谢谢大家的建议和提示!我真的很感激!我认为布莱恩的建议是最简单的,我就这样解决了:

IRegion region = this._regionManager.Regions [RegionNames.ActionRegion];

        object boxView = region.GetView("BoxDetailsView");
        if (boxView == null)
        {
            boxView = ServiceLocator.Current.GetInstance<BoxDetailsView>();
            region.Add(boxView, "BoxDetailsView");
            // Navigate to view
            var parameters = new NavigationParameters();
            parameters.Add("BOXID", param);
            _regionManager.RequestNavigate(RegionNames.ActionRegion, new Uri("BoxDetailsView" + parameters, UriKind.Relative));

        }