public void Invoke(IRibbonControl control, Expression<Action> caller, params object[] parameters) { try { CallbackTarget callbackTarget = vstoContribContext.TagToCallbackTargetLookup[control.Tag + caller.GetMethodName()]; IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(control.Context); Type type = viewModelInstance.GetType(); PropertyInfo property = type.GetProperty(callbackTarget.Method); if (property != null) { type.InvokeMember(callbackTarget.Method, BindingFlags.SetProperty, null, viewModelInstance, new[] { parameters.Single() }); } else { type.InvokeMember(callbackTarget.Method, BindingFlags.InvokeMethod, null, viewModelInstance, new[] { control } .Concat(parameters) .ToArray()); } } catch (TargetInvocationException e) { var innerEx = e.InnerException; PreserveStackTrace(innerEx); if (vstoContribContext.ErrorHandlers.Count == 0) { Trace.TraceError(innerEx.ToString()); } var handled = vstoContribContext.ErrorHandlers.Any(errorHandler => errorHandler.Handle(innerEx)); if (!handled) throw innerEx; } }
public string InvokeGetContent(IRibbonControl control, Expression<Action> caller, params object[] parameters) { // Remove any previous registered callbacks for this dynamic context vstoContribContext.RemoveCallbacksForDynamicContext(control.Tag); // Delegate to the view model to get the raw xml var xmlString = InvokeGet(control, caller, parameters); if (xmlString == null) return null; // Rewrite the XML with our callbacks, registering new callback targets var ribbonXmlRewriter = new RibbonXmlRewriter(vstoContribContext, ribbonViewModelResolver); var ribbonType = vstoContribContext.TagToCallbackTargetLookup[control.Tag + caller.GetMethodName()].RibbonType; return ribbonXmlRewriter.RewriteDynamicXml(ribbonType, control.Tag, xmlString.ToString()); }
public object InvokeGet(IRibbonControl control, Expression<Action> caller, params object[] parameters) { var methodName = caller.GetMethodName(); CallbackTarget callbackTarget = vstoContribContext.TagToCallbackTargetLookup[control.Tag + methodName]; var view = (object)control.Context; IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(view); VstoContribLog.Debug(l => l("Ribbon callback {0} being invoked on {1} (View: {2}, ViewModel: {3})", methodName, control.Id, view.ToLogFormat(), viewModelInstance.ToLogFormat())); Type type = viewModelInstance.GetType(); PropertyInfo property = type.GetProperty(callbackTarget.Method); if (property != null) { return type.InvokeMember(callbackTarget.Method, BindingFlags.GetProperty, null, viewModelInstance, null); } try { return type.InvokeMember(callbackTarget.Method, BindingFlags.InvokeMethod, null, viewModelInstance, new[] { control } .Concat(parameters) .ToArray()); } catch (MissingMethodException) { throw new InvalidOperationException( string.Format("Expecting method with signature: {0}.{1}(IRibbonControl control)", type.Name, callbackTarget.Method)); } }
public void Invoke(IRibbonControl control, Expression<Action> caller, params object[] parameters) { try { var methodName = caller.GetMethodName(); CallbackTarget callbackTarget = vstoContribContext.TagToCallbackTargetLookup[control.Tag + methodName]; var view = (object)control.Context; IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(view); VstoContribLog.Debug(l => l("Ribbon callback {0} being invoked on {1} (View: {2}, ViewModel: {3})", methodName, control.Id, view.ToLogFormat(), viewModelInstance.ToLogFormat())); Type type = viewModelInstance.GetType(); PropertyInfo property = type.GetProperty(callbackTarget.Method); if (property != null) { type.InvokeMember(callbackTarget.Method, BindingFlags.SetProperty, null, viewModelInstance, new[] { parameters.Single() }); } else { type.InvokeMember(callbackTarget.Method, BindingFlags.InvokeMethod, null, viewModelInstance, new[] { control } .Concat(parameters) .ToArray()); } } catch (TargetInvocationException e) { var innerEx = e.InnerException; PreserveStackTrace(innerEx); if (vstoContribContext.ErrorHandlers != null && vstoContribContext.ErrorHandlers.Count == 0) { Trace.TraceError(innerEx.ToString()); } var handled = vstoContribContext.ErrorHandlers != null && vstoContribContext.ErrorHandlers.Any(errorHandler => errorHandler.Handle(innerEx)); if (!handled) throw innerEx; } }
public object InvokeGet(IRibbonControl control, Expression<Action> caller, params object[] parameters) { CallbackTarget callbackTarget = vstoContribContext.TagToCallbackTargetLookup[control.Tag + caller.GetMethodName()]; IRibbonViewModel viewModelInstance = ribbonViewModelResolver.ResolveInstanceFor(control.Context); Type type = viewModelInstance.GetType(); PropertyInfo property = type.GetProperty(callbackTarget.Method); if (property != null) { return type.InvokeMember(callbackTarget.Method, BindingFlags.GetProperty, null, viewModelInstance, null); } try { return type.InvokeMember(callbackTarget.Method, BindingFlags.InvokeMethod, null, viewModelInstance, new[] { control } .Concat(parameters) .ToArray()); } catch (MissingMethodException) { throw new InvalidOperationException( string.Format("Expecting method with signature: {0}.{1}(IRibbonControl control)", type.Name, callbackTarget.Method)); } }