wpf - CoerceValue not working correctly with POCO objects -


i've run issue seems pretty strange , i'm not sure if bug or design feature of wpf.

i have dependency object dependency property constraints enforced via value coercion , works expected when using property in bindings other dependency properties.

but things break down when trying use property in binding against poco object. in case poco updated when dependency property changes, before value coercion executed, leaving poco invalid/out-of-sync value.

here's example:

public class testdo : dependencyobject {              public static dependencyproperty numberproperty =         dependencyproperty.register("number", typeof(int), typeof(testdo),                                     new frameworkpropertymetadata(0, frameworkpropertymetadataoptions.none, onnumberchanged, onnumbercoerce));      public int number     {         { return (int)getvalue(numberproperty); }         set {  setvalue(numberproperty, value); }     }      private static void onnumberchanged(dependencyobject d, dependencypropertychangedeventargs e)     {         console.writeline("depobj: numberchanged {0} --> {1}", e.oldvalue, e.newvalue);                 }      private static object onnumbercoerce(dependencyobject d, object value)     {         int cval = (int)value;         if (cval > 10)             cval = 10;         else if (cval < -10)             cval = 10;          console.writeline("depobj: onnumbercoerce: {0} --> {1}", value, cval);          return cval;     } }  public class testpoco {     private int _poconumber = 0;     public int poconumber     {         { return _poconumber; }         set { _poconumber = value; }     } } 

now, can create 2 instances of types above , binding , test setting number property. binding updates poco object before value coercion.

// create poco object var testpoco = new testpoco();  // create dependency object var testobj = new testdo();  // create binding between numberproperty of dependency object ,  // poconumber of poco object bindingoperations.setbinding(testobj, testdo.numberproperty, new binding("poconumber")                 {                     source = testpoco,                     mode = bindingmode.twoway                 });  // try setting value of 100, trigger value coercion testobj.number = 100;     console.writeline("poco number = {0}", testpoco.poconumber);  // displays 100 console.writeline("dp number = {0}", testobj.number);  // displays 10 

the same not true if binding exists between 2 dependencyobjects. in case works expected. setvalue --> valuecoercion --> propertychanged --> setvalue


Comments