c# - Using Generics on Classes with Static DependencyProperty -
we looking @ creating helper class validation on devexpress wpf application single view model.
in our xaml, want add reference our validationservicehelper class:
<dxlc:datalayoutcontrol x:name="layoutcontrolmyobject" style="{staticresource entityview.datalayoutcontrol}" viewmodel:validationservicehelper.haserrors="{binding relativesource={relativesource self}, path=(dxe:validationservice.hasvalidationerror)}"> the validationservicehelper class looks this:
namespace myapplication.viewmodels { public partial class myobjectviewmodel : singleobjectviewmodel<myobject, int, imyentityunitofwork> { // ... } public class validationservicehelper { public static bool gethaserrors(dependencyobject obj) { return (bool)obj.getvalue(haserrorsproperty); } public static void sethaserrors(dependencyobject obj, bool value) { obj.setvalue(haserrorsproperty, value); } public static readonly dependencyproperty haserrorsproperty = dependencyproperty.registerattached("haserrors", typeof(bool), typeof(validationservicehelper), new propertymetadata(false, onhaserrorschanged)); private static void onhaserrorschanged(dependencyobject d, dependencypropertychangedeventargs e) { try { frameworkelement element = (frameworkelement)d; element.dispatcher.begininvoke(new action(() => ((myobjectviewmodel)element.datacontext).viewhaserrors = (bool)e.newvalue)); var err = validationservice.getvalidationerrors(d); if (err != null) element.dispatcher.begininvoke(new action(() => ((myobjectviewmodel)element.datacontext).viewerrors = err.select(p => p.errorcontent).distinct().aggregate( (j, i) => string.format("{0}{1}{2}", i, environment.newline, j)).tostring())); } catch (exception ex) { throw new exception(ex.message); } } } } looking @ 2 dispatcher.begininvoke calls in onhaserrorschanged, see hard-coded cast myobjectviewmodel.
element.dispatcher.begininvoke(new action(() => ((myobjectviewmodel)element.datacontext).viewhaserrors = (bool)e.newvalue)); written this, need create different helper class. there way make generic, can use 1 class view models?
you derive view model classes common base class (or implement interface) viewerrors property defined , cast type:
var vm = element.datacontext baseviewmodel; if (vm != null) element.dispatcher.begininvoke(new action(() => vm.viewhaserrors = (bool)e.newvalue)); but never able cast datacontext other type actual type of object in memory. using generics 1 way or doesn't change fact.
and there no way cast singleobjectviewmodel<a, int, imyentityunitofwork> singleobjectviewmodel<b, int, imyentityunitofwork> because these 2 totally different types.
Comments
Post a Comment