c# - How to debug INPC property setter not triggered? -


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