c# - Workaround to avoid "Cannot create default converter to perform 'two-way' conversions between types 'Derived_N' and 'Base'" error -


i have types hierarchy:

public class base {} public class derived_1 : base {} public class derived_2 : base {} // more descendants... public class derived_n : base {} 

types hierarchy used lookup lists in view models:

public class someviewmodel {     // available items     public ienumerable<derived_n> someitems { get; }      // selected item     public derived_n selecteditem { get; set; }      // there several property pairs above } 

to select values lookup list i've created user control (some sort of selector). since point of selection process base descendants looks similar, user control operates base type properties:

    public ienumerable<base> itemssource     {         { return (ienumerable<base>)getvalue(itemssourceproperty); }         set { setvalue(itemssourceproperty, value); }     }      public static readonly dependencyproperty itemssourceproperty =         dependencyproperty.register("itemssource", typeof(ienumerable<base>), typeof(baseselector), new propertymetadata(null));      public base selecteditem     {         { return (base)getvalue(selecteditemproperty); }         set { setvalue(selecteditemproperty, value); }     }      public static readonly dependencyproperty selecteditemproperty =         dependencyproperty.register("selecteditem", typeof(base), typeof(baseselector), new frameworkpropertymetadata(null, frameworkpropertymetadataoptions.bindstwowaybydefault)); 

xaml looks like:

<myctrls:baseselector itemssource="{binding someitems}"                       selecteditem="{binding selecteditem}"/> 

this works expected, there binding errors this:

cannot create default converter perform 'two-way' conversions between types 'derived_n' , 'base'

i know, why in output window - in theory, selecteditem type, derived base, in practice not case. error disappears, if converter:

public class dummyconverter : ivalueconverter {     public object convert(object value, type targettype, object parameter, cultureinfo culture)     {         return value;     }      public object convertback(object value, type targettype, object parameter, cultureinfo culture)     {         return value;     } } 

is used in binding:

<myctrls:baseselector itemssource="{binding someitems}"                       selecteditem="{binding selecteditem, converter={staticresource dummyconverterkey}}"/> 

but don't want use @ - can see, there no payload in converter (while there lot such of properties).

are there other workaround?

for now, i've solved problem replacing property type user control's properties ienumerable / object respectively (ienumerable<object> / object solution):

    public static readonly dependencyproperty itemssourceproperty =         dependencyproperty.register("itemssource", typeof(ienumerable), typeof(baseselector), new propertymetadata(null));      public static readonly dependencyproperty selecteditemproperty =         dependencyproperty.register("selecteditem", typeof(object), typeof(baseselector), new frameworkpropertymetadata(null, frameworkpropertymetadataoptions.bindstwowaybydefault)); 

this leads type checking inside user control, doesn't generate binding errors (and don't understand, why - case object same base, imo).


Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -