c# - Pass Parameter into ViewModel constructor dependent on navigation region? -
i have wpf application try move prism step step. current step regionmanager , navigationservice / composite ui.
i did implement own regionmanager , navigationservice deal details, try replace own implementation prism regionmanager (because contains functionality nice) here problem try solve:
i have tabcontrol able display multiple contents not have each other (like browser). tabcontrol has template set creates new region each content display (so have navigationservice , journey each tabitem)
<userinterface:tabcontrolhelper.template> <datatemplate datatype="{x:type viewmodels:contentviewmodel}"> <contentcontrol x:name="datacontextproxy"> <contentcontrol prism:regionmanager.regionname="{binding elementname=datacontextproxy, path=datacontext.(viewmodels:contentviewmodel.id)}" prism:regionmanager.regionmanager="{binding relativesource={relativesource ancestortype=views:contentoverview}, path=datacontext.regionmanager}" background="{staticresource backgroundbrush}" datacontext="{x:null}" /> </contentcontrol> </datatemplate> </userinterface:tabcontrolhelper.template>
now when tabcontrol.selecteditem
changed new content navigate homeview using following code:
regionmanager.regions[this.selectedcontent.id].requestnavigate("homeview");
the navigation works fine, viewmodel creation not: in own implementation handled autowireviewmodel
attachedproperty inside navigation. everytime navigated view checked if has set autowireviewmodel
to true, , if created viewmodel able inject correct content using name of region (which content.id)
here stuck. homeviewmodel
needs have access current content should display. know possible inject content via navigationcontext
, homeviewmodel
should not care icontent
instance comes from, depends on (it not optional prefer passing in via constructor). , homeview
1 of lot views need know current content, means if push content viewmodel via navigationparameters
either need code takes content every time, or need ugly base class takes care of taking navigationparameter
, validating contains instance of icontent (which me seems "action @ distance").
how can alter prism navigation , autowireviewmodel automatically resolve correct instance of icontent? should use this:
icontent targetcontent = container.resolve<icontentmanager>.contents[this.regionthatdidinvokethenavigation.name]
or there better approach achieve desired behaviour?
i've had similar problem, , have liked if prism modified regionnavigationservice give option influence viewmodel creation (see https://github.com/prismlibrary/prism/issues/367).
if don't implement inavigationaware
on viewmodel (which implies you're left in uninitalized state until navigation happens), modify regionnavigationservice.executenavigation
this:
[...update journal...] // create , set view model based on navigation context var viewasdependencyobject = view dependencyobject; if (viewasdependencyobject != null) { var createviewmodelonnavigateto = viewmodellocator.getcreateviewmodelonnavigateto( viewasdependencyobject ); if (createviewmodelonnavigateto) viewmodellocator.bind( view, _viewmodelprovider.createviewmodel( viewasdependencyobject, navigationcontext ) ); } [...inform view...]
_viewmodelprovider
service creates viewmodels navigationcontext
, createviewmodelonnavigate
attached property similar autowireviewmodel
.
Comments
Post a Comment