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 autowireviewmodelattachedproperty inside navigation. everytime navigated view checked if has set autowireviewmodelto 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

Popular posts from this blog

ruby - Trying to change last to "x"s to 23 -

jquery - Clone last and append item to closest class -

c - Unrecognised emulation mode: elf_i386 on MinGW32 -