c# - How to write a Drop event for a Data Grid -
i tried write drop event data grid in wpf application framework.
xaml
<datagrid> <i:interaction.behaviors> <beh:eventtocommandbehavior command="{binding dropcommand}" event="drop" passarguments="true" /> </i:interaction.behaviors> </datagrid> viewmodel:
public actioncommand<drageventargs> dropcommand { get; private set; } this.dropcommand = new actioncommand<drageventargs>(ondrop); private void ondrop(drageventargs e) { // ... } eventtocommandbehavior:
/// <summary> /// behavior connect ui event viewmodel command, /// allowing event arguments passed commandparameter. /// </summary> public class eventtocommandbehavior : behavior<frameworkelement> { private delegate _handler; private eventinfo _oldevent; // event public string event { { return (string)getvalue(eventproperty); } set { setvalue(eventproperty, value); } } public static readonly dependencyproperty eventproperty = dependencyproperty.register("event", typeof(string), typeof(eventtocommandbehavior), new propertymetadata(null, oneventchanged)); // command public icommand command { { return (icommand)getvalue(commandproperty); } set { setvalue(commandproperty, value); } } public static readonly dependencyproperty commandproperty = dependencyproperty.register("command", typeof(icommand), typeof(eventtocommandbehavior), new propertymetadata(null)); // passarguments (default: false) public bool passarguments { { return (bool)getvalue(passargumentsproperty); } set { setvalue(passargumentsproperty, value); } } public static readonly dependencyproperty passargumentsproperty = dependencyproperty.register("passarguments", typeof(bool), typeof(eventtocommandbehavior), new propertymetadata(false)); private static void oneventchanged(dependencyobject d, dependencypropertychangedeventargs e) { var beh = (eventtocommandbehavior)d; if (beh.associatedobject != null) // not yet attached @ initial load beh.attachhandler((string)e.newvalue); } protected override void onattached() { attachhandler(this.event); // initial set } /// <summary> /// attaches handler event /// </summary> private void attachhandler(string eventname) { // detach old event if (_oldevent != null) _oldevent.removeeventhandler(this.associatedobject, _handler); // attach new event if (!string.isnullorempty(eventname)) { eventinfo ei = this.associatedobject.gettype().getevent(eventname); if (ei != null) { methodinfo mi = this.gettype().getmethod("executecommand", bindingflags.instance | bindingflags.nonpublic); _handler = delegate.createdelegate(ei.eventhandlertype, this, mi); ei.addeventhandler(this.associatedobject, _handler); _oldevent = ei; // store detach in case event property changes } else throw new argumentexception(string.format("the event '{0}' not found on type '{1}'", eventname, this.associatedobject.gettype().name)); } } /// <summary> /// executes command /// </summary> private void executecommand(object sender, eventargs e) { object parameter = this.passarguments ? e : null; if (this.command != null) { if (this.command.canexecute(parameter)) this.command.execute(parameter); } } } actioncommand:
public class actioncommand<t> : icommand { public event eventhandler canexecutechanged; private action<t> _action; public actioncommand(action<t> action) { _action = action; } public bool canexecute(object parameter) { return true; } public void execute(object parameter) { if (_action != null) { var castparameter = (t)convert.changetype(parameter, typeof(t)); _action(castparameter); } } } but not working , giving error "cannot bind target method because signature or security transparency not compatible of delegate type".
find classes eventtocommandbehavior , actioncommand classes better understanding code have written , provide me solution .
Comments
Post a Comment