windows 8 - Attached.Property="{Binding}" does not work -


i have created simple attached property enables dragging item around screen.

1/ here's how implement on element:

<rectangle fill="green" local:myextension.canmove="true" /> 

2/ works charm. this:

// in resources <x:boolean x:key="mycanmove">true</x:boolean> <rectangle fill="blue" local:myextension.canmove="{staticresource mycanmove}" /> 

3/ 1 syntax not work. this fails:

<rectangle fill="red" local:myextension.canmove="{binding path=canmove}" /> 

what's different? thing different is binding value attached property instead of setting explicitly or through static resource.

i'm missing something. it?

here's full xaml:

<grid background="{staticresource applicationpagebackgroundthemebrush}">      <grid.datacontext>         <local:viewmodel/>     </grid.datacontext>      <toggleswitch header="enable dragging"                    horizontalalignment="center"                    ison="{binding canmove, mode=twoway}">         <toggleswitch.rendertransform>             <translatetransform y="-100" />         </toggleswitch.rendertransform>     </toggleswitch>      <stackpanel orientation="horizontal" horizontalalignment="center" verticalalignment="center">         <stackpanel.resources>             <style targettype="rectangle">                 <setter property="height" value="100" />                 <setter property="width" value="100" />             </style>             <x:boolean x:key="mycanmove">true</x:boolean>         </stackpanel.resources>         <rectangle fill="green" local:myextension.canmove="true" />         <rectangle fill="blue" local:myextension.canmove="{staticresource mycanmove}" />         <rectangle fill="red" local:myextension.canmove="{binding path=canmove}" />     </stackpanel>  </grid> 

and here's full code-behind:

public class viewmodel : inotifypropertychanged {     public event propertychangedeventhandler propertychanged;      bool m_canmove = true;     public bool canmove     {         { return m_canmove; }         set         {             m_canmove = value;             if (propertychanged != null)                 propertychanged(this, new propertychangedeventargs("canmove"));         }     } }  public class myextension {     // canmove aproperty     public static bool getcanmove(dependencyobject obj)     {         return (bool)obj.getvalue(canmoveproperty);     }     public static void setcanmove(dependencyobject obj, bool value)     {         system.diagnostics.debug.writeline("setcanmove");         obj.setvalue(canmoveproperty, value);          var rectangle = obj frameworkelement;         rectangle.manipulationmode = manipulationmodes.translatex | manipulationmodes.translatey;         rectangle.manipulationdelta -= rectangle_manipulationdelta;         if (value)             rectangle.manipulationdelta += rectangle_manipulationdelta;     }     public static readonly dependencyproperty canmoveproperty =         dependencyproperty.registerattached("canmove", typeof(bool), typeof(myextension), new propertymetadata(false));      // implementation     static void rectangle_manipulationdelta(object sender, manipulationdeltaroutedeventargs e)     {         var rectangle = sender frameworkelement;         var canmove = system.convert.toboolean(rectangle.getvalue(myextension.canmoveproperty));         if (canmove)         {             var transform = rectangle.rendertransform compositetransform;             if (transform == null)                 rectangle.rendertransform = (transform = new compositetransform());             transform.translatex += e.delta.translation.x;             transform.translatey += e.delta.translation.y;         }     } } 

i'll remind attached property works fine in first 2 syntaxes. result, can't imagine error in attached property. and, read on few forums path= necessary bind attached property, included (though didn't make difference). changing mode (oneway, twoway) doesn't make difference. binding elementname didn't make difference. wondering if isn't enabled in windows 8.0 winrt. can else work?

edit: solution

the problem without changed event handler setup, binding doesn't raise changed event. here's updated myextension code:

public class myextension {     // canmove aproperty     public static bool getcanmove(dependencyobject obj) { return (bool)obj.getvalue(canmoveproperty); }     public static void setcanmove(dependencyobject obj, bool value) { obj.setvalue(canmoveproperty, value); }     public static readonly dependencyproperty canmoveproperty =         dependencyproperty.registerattached("canmove", typeof(bool), typeof(myextension), new propertymetadata(false, oncanmovechanged));      // respond change     private static void oncanmovechanged(dependencyobject d, dependencypropertychangedeventargs e)     {         var rectangle = d frameworkelement;         rectangle.manipulationmode = manipulationmodes.translatex | manipulationmodes.translatey;         rectangle.manipulationdelta -= rectangle_manipulationdelta;         if ((bool)e.newvalue)             rectangle.manipulationdelta += rectangle_manipulationdelta;     }      // implementation     static void rectangle_manipulationdelta(object sender, manipulationdeltaroutedeventargs e)     {         var rectangle = sender frameworkelement;         var canmove = system.convert.toboolean(rectangle.getvalue(myextension.canmoveproperty));         if (canmove)         {             var transform = rectangle.rendertransform compositetransform;             if (transform == null)                 rectangle.rendertransform = (transform = new compositetransform());             transform.translatex += e.delta.translation.x;             transform.translatey += e.delta.translation.y;         }     } } 

this speculation don't have compiler in front of me, i'm wondering if binding infrastructure doesn't use exposed methods created getcanmove etc.

try registering property changed method in propertymetadata

new propertymetadata(false, oncanmovechanged) 

and have setup , teardown code in there

private void oncanmovechanged(dependencyobject d, dependencypropertychangedeventargs e) 

Comments

Popular posts from this blog

ios - UICollectionView Self Sizing Cells with Auto Layout -

node.js - ldapjs - write after end error -

DOM Manipulation in Wordpress (and elsewhere) using php -