overview: i've set property inpc invokes page navigation in view code behind mainviewmodel
. property bound selecteditem property of list view in bound view.
the inpc implementation inherited viewmodelbase
class implemented follows, https://gist.github.com/brianjvarley/4a0890b678e037296aba
issue:
when select item list view, property selectedcouncilitem
setter doesn't trigger. property bound selecteditem property of list view.
debugging steps:
- checked binding names selecteditem in list view property, same property name in mainviewmodel.
- ran solution , checked binding errors in output window, there none.
- placed break point on selectedcouncilitem doesn't triggered when select list view.
- checked data context setup view verified view set data context of mainviewmodel.
question:
does know other steps can take in debugging issue, or issue might be?
code:
mainpage - (list view)
<grid x:name="contentpanel" grid.row="1" margin="12,0,12,0"> <phone:longlistselector x:name="mainlonglistselector" margin="0,0,-12,0" itemssource="{binding items}" selecteditem="{binding selectedcouncilitem}"> <phone:longlistselector.itemtemplate> <datatemplate> <stackpanel margin="0,0,0,17"> <textblock style="{staticresource phonetextextralargestyle}" text="{binding councilacronym}" textwrapping="wrap" /> <textblock margin="12,-6,12,0" style="{staticresource phonetextsubtlestyle}" text="{binding councilfullname}" textwrapping="wrap" /> </stackpanel> </datatemplate> </phone:longlistselector.itemtemplate> </phone:longlistselector> </grid>
mainviewmodel - (summary)
namespace parkingtagpicker.viewmodels { public class mainviewmodel : viewmodelbase { //dependency injection private instances private inavigationcallback _navcallback = null; public mainviewmodel() { this.items = new observablecollection<itemviewmodel>(); } /// <summary> /// creates , adds few itemviewmodel objects items collection. /// </summary> public void loadcouncilnamesdata() { this.items.add(new itemviewmodel() { id = "6", councilacronym = "wtc", councilfullname = "wicklow town council"}); this.items.add(new itemviewmodel() { id = "7", councilacronym = "ts", councilfullname = "tallaght stadium" }); this.items.add(new itemviewmodel() { id = "8", councilacronym = "gs", councilfullname = "greystones" }); this.isdataloaded = true; } public observablecollection<itemviewmodel> items { get; private set; } public bool isdataloaded { get; private set; } private itemviewmodel _selectedcouncilitem; public itemviewmodel selectedcouncilitem { { return this._selectedcouncilitem; } set { this.setproperty(ref this._selectedcouncilitem, value, () => this._selectedcouncilitem); if (_selectedcouncilitem != null) { _navcallback.navigateto(_selectedcouncilitem.id); } } } public inavigationcallback navigationcallback { { return _navcallback; } set { _navcallback = value; } } } }
viewmodelbase - (detailing inpc implementation)
namespace parkingtagpicker.viewmodels { public abstract class viewmodelbase : inotifypropertychanged { public event propertychangedeventhandler propertychanged; protected void raisepropertychanged(string propertyname) { var propertychanged = this.propertychanged; if (propertychanged != null) { propertychanged(this, new propertychangedeventargs(propertyname)); } } protected bool setproperty<t>(ref t backingfield, t value, expression<func<t>> propertyexpression) { var changed = !equalitycomparer<t>.default.equals(backingfield, value); if (changed) { backingfield = value; this.raisepropertychanged(extractpropertyname(propertyexpression)); } return changed; } private static string extractpropertyname<t>(expression<func<t>> propertyexpression) { var memberexp = propertyexpression.body memberexpression; if (memberexp == null) { throw new argumentexception("expression must memberexpression.", "propertyexpression"); } return memberexp.member.name; } } }
there issue control. please try using custom longlistseletor
public class extendedlonglistselector : microsoft.phone.controls.longlistselector { public extendedlonglistselector() { selectionchanged += longlistselector_selectionchanged; } void longlistselector_selectionchanged(object sender, selectionchangedeventargs e) { selecteditem = base.selecteditem; } public static readonly dependencyproperty selecteditemproperty = dependencyproperty.register("selecteditem", typeof(object), typeof(longlistselector), new propertymetadata(null, onselecteditemchanged)); private static void onselecteditemchanged(dependencyobject d, dependencypropertychangedeventargs e) { var selector = (longlistselector)d; selector.selecteditem = e.newvalue; } public new object selecteditem { { return getvalue(selecteditemproperty); } set { setvalue(selecteditemproperty, value); } } }
and implement in replace in xaml existing list.
xmlns:controls="clr-namespace:projectname.foldername" <controls:extendedlonglistselector x:name="mainlonglistselector" margin="0,0,-12,0" itemssource="{binding items}" selecteditem="{binding selectedcouncilitem}"> </controls:extendedlonglistselector>
Comments
Post a Comment