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

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条回答

      报告相同问题?

      相关推荐 更多相似问题

      悬赏问题

      • ¥15 python写一下 if问题
      • ¥15 opencv c++虚拟画家
      • ¥20 python 生成exe报错问题
      • ¥30 基于香农-费诺-埃利斯编码实现对英文文本的压缩和解压缩
      • ¥15 react native ios端amap问题
      • ¥15 fortran95中5个学生分不同学号求数学语文英语计算机四门课程的每名学生的平均分以及名次以及单科成绩的平均分
      • ¥30 excel vba 执行从 1 到 100 的乘法。执行结果保存成二维数组
      • ¥15 数字电子技术基础设计实验
      • ¥15 ue5运行非常卡顿,是电脑配置原因吗
      • ¥50 有没有大佬看一下关于思科的这道题怎么做