我怎样才能使MarkupExtenstion在WPF 4.5按钮点击事件? [英] How can I make MarkupExtenstion for button click event in WPF 4.5?

查看:202
本文介绍了我怎样才能使MarkupExtenstion在WPF 4.5按钮点击事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要创建的MarkupExtension,为按钮的Click事件的支持。我有一篇文章previewKeyDown <一href="http://www.jonathanantoine.com/2011/09/23/wpf-4-5s-markupextension-invoke-a-method-on-the-viewmodel-datacontext-when-an-event-is-raised/"相对=nofollow>此处。我想,它抛出一个异常来修改它的点击,但未能如愿。

请建议如何实现这一点。

解决方案

看起来像它试图投的MethodInfo EventInfo ,返回的目标属性可以是一个的MethodInfo EventInfo ,你将有createing委托<前检查这/ P>

试试这个

 公共类电话:的MarkupExtension
    {
        公共字符串ActionName {获得;组; }
        公共电话(字符串actionName){ActionName = actionName; }

        公众覆盖对象ProvideValue(的IServiceProvider的ServiceProvider)
        {
            IProvideValueTarget targetProvider =的ServiceProvider
                .GetService(typeof运算(IProvideValueTarget))作为IProvideValueTarget;
            如果(targetProvider == NULL)
                抛出新的InvalidOperationException异常(@的CallAction扩展
                无法检索到的IProvideValueTarget服务)。

            VAR的目标= targetProvider.TargetObject为FrameworkElement的;
            如果(目标== NULL)
                抛出新的InvalidOperationException异常(@的CallAction扩展
                    只能用在FrameworkElement上)。

            如果(targetProvider.TargetProperty是MethodInfo的)
            {
                VAR targetEventAddMethod = targetProvider.TargetProperty作为MethodInfo的;
                如果(targetEventAddMethod!= NULL)
                {
                    信息参数[]标准杆= targetEventAddMethod.GetParameters();
                    键入delegateType =标准杆[1] .ParameterType;
                    MethodInfo的MethodInfo的= this.GetType()GetMethod的(MyProxyHandler,BindingFlags.NonPublic可| BindingFlags.Instance)。
                    返回Delegate.CreateDelegate(delegateType,这一点,MethodInfo的); ;
                }

            }
            否则,如果(targetProvider.TargetProperty是EventInfo)
            {
                VAR targetEventInfo = targetProvider.TargetProperty为EventInfo;
                如果(targetEventInfo!= NULL)
                {
                    键入delegateType = targetEventInfo.EventHandlerType;
                    MethodInfo的MethodInfo的= this.GetType()GetMethod的(MyProxyHandler,BindingFlags.NonPublic可| BindingFlags.Instance)。
                    返回Delegate.CreateDelegate(delegateType,这一点,MethodInfo的);
                }
            }
            返回null;
        }

        无效MyProxyHandler(对象发件人,EventArgs的)
        {
            FrameworkElement的目标=发件人的FrameworkElement的;
            如果(目标== NULL)回报;
            VAR的DataContext = target.DataContext;
            如果(DataContext的== NULL)回报;

            //获取方法,从它的名字中的datacontext
            MethodInfo的MethodInfo的= dataContext.GetType()
                .GetMethod(ActionName,BindingFlags.Public | BindingFlags.Instance);
            methodInfo.Invoke(DataContext的,NULL);
        }
    }
 

I want to create the MarkupExtension to provide support for Button click event. I have got an article for PreviewKeyDown here. I tried to modify it for Click but unable to do so as it throws an exception

Please suggest how to implement this.

解决方案

Looks like its trying to cast MethodInfo as EventInfo, the returned target property could be a MethodInfo or EventInfo you will have to check this before createing the delegate

Try this

    public class Call : MarkupExtension
    {
        public string ActionName { get; set; }
        public Call(string actionName) { ActionName = actionName; }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            IProvideValueTarget targetProvider = serviceProvider
                .GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
            if (targetProvider == null)
                throw new InvalidOperationException(@"The CallAction extension 
                can't retrieved the IProvideValueTarget service.");

            var target = targetProvider.TargetObject as FrameworkElement;
            if (target == null)
                throw new InvalidOperationException(@"The CallAction extension 
                    can only be used on a FrameworkElement.");

            if (targetProvider.TargetProperty is MethodInfo)
            {
                var targetEventAddMethod = targetProvider.TargetProperty as MethodInfo;
                if (targetEventAddMethod != null)
                {
                    ParameterInfo[] pars = targetEventAddMethod.GetParameters();
                    Type delegateType = pars[1].ParameterType;
                    MethodInfo methodInfo = this.GetType().GetMethod("MyProxyHandler", BindingFlags.NonPublic | BindingFlags.Instance);
                    return Delegate.CreateDelegate(delegateType, this, methodInfo); ;
                }

            }
            else if (targetProvider.TargetProperty is EventInfo)
            {
                var targetEventInfo = targetProvider.TargetProperty as EventInfo;
                if (targetEventInfo != null)
                {
                    Type delegateType = targetEventInfo.EventHandlerType;
                    MethodInfo methodInfo = this.GetType().GetMethod("MyProxyHandler", BindingFlags.NonPublic | BindingFlags.Instance);
                    return Delegate.CreateDelegate(delegateType, this, methodInfo);
                }
            }
            return null;
        }

        void MyProxyHandler(object sender, EventArgs e)
        {
            FrameworkElement target = sender as FrameworkElement;
            if (target == null) return;
            var dataContext = target.DataContext;
            if (dataContext == null) return;

            //get the method on the datacontext from its name
            MethodInfo methodInfo = dataContext.GetType()
                .GetMethod(ActionName, BindingFlags.Public | BindingFlags.Instance);
            methodInfo.Invoke(dataContext, null);
        }
    }

这篇关于我怎样才能使MarkupExtenstion在WPF 4.5按钮点击事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆