我对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,但是,我还没有找到实现它的方法。
我觉得我非常接近,但做了一些小事。有人可以帮忙吗?
谢谢,
<磷>氮答案 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));
}