岁月静好_cai 2015-05-29 07:03 采纳率: 75%
浏览 2068
已采纳

MVVM模式如何将方法作为参数传递且同时指定回调函数?

MyViewModel是我能修改的类,AlertMessage类是人家封装好的类,我不能修改。请问我要怎么才能实现如题所述的?以下是我的代码

public class MyViewModel
    {
        public MyViewModel()
        {
            SelectCommand = new DelegateCommand(SelectCommand_Execute); ;
        }       

        public ICommand SelectCommand { get; set; }

        protected virtual void SelectCommand_Execute()
        {
        }

        // 我要怎么传递这个回调函数,这个回调函数没有CommandExecutingMessage
        private bool Callback(ICommand myCommand)
        {
            return true;
        }

        public void DoSomething()
        {
            MessageBus bus = new MessageBus();

            // Questions 
            // WithCommandLifetime方法把一个方法作为参数,同时指定了一个回调            
            // 注意WithCommandLifetime()方法检查了CommandExecutingMessage类型
            // 我要怎么样才能获取到CommandExecutingMessage类型来使WithCommandLifetime()指定回调函数
            // 我要如何构建这个调用?
            bus.Warning("This is test message").WithCommandLifetime(what goes here);
        }
    }
 public class AlertMessage
    {
        public AlertMessage(string msg)
        {
            this.Message = msg;
        }

        public string Message { get; set; }

        public bool IsExpired(object message)
        {
            var result = false;

            if (IsExpiredDelegate != null)
            {
                result = IsExpiredDelegate(message);
            }

            return result;
        }

        public Func<object, bool> IsExpiredDelegate
        {
            get;
            set;
        }
    }

    public class MessageBus
    {
        public AlertMessage Warning(string msg)
        {
            return new AlertMessage(msg);
        }
    }

    public static class AlertMessageLifetimePolicies
    {
        public static AlertMessage WithCommandLifetime(this AlertMessage source, Func<ICommand, bool> isExpiredCallback)
        {
            source.IsExpiredDelegate = data =>
            {
                var result = false;
                var asCommandExecutingMessage = (data as CommandExecutingMessage);
                if (asCommandExecutingMessage != null)
                {
                    result = isExpiredCallback(asCommandExecutingMessage.Sender);
                }

                return result;
            };

            return source;
        }
    }

    public class CommandExecutingMessage
    {
        private ICommand _sender;
        public CommandExecutingMessage(ICommand sender)
        {
            this._sender = sender;
        }

        new public ICommand Sender
        {
            get { return this._sender; }
        }
    }
  • 写回答

1条回答 默认 最新

  • 岁月静好_cai 2015-05-29 09:07
    关注

    找到答案了,调用方法如下:

      public void DoSomething()
            {
                MessageBus bus = new MessageBus();
                //assign callback method
                AlertMessage alertMessage = bus.Warning("this").WithCommandLifetime((x) => Callback(SelectCommand));
                CommandExecutingMessage commandExcutingMessage = new CommandExecutingMessage(SelectCommand);
                //call the Callback method
                alertMessage.IsExpiredDelegate(commandExcutingMessage);
            }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题