菲佣的WPF——1

所有外包程序员都是菲佣

这个开头自娱自乐。今天就发我自己写的WPF DeletegateCommand 类。用于ICommnad的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace WpfApplication4
{
    public class DeletegateCommand : ICommand
    {
        #region << Field >>
        private readonly Action<object> excute;
        private readonly Func<object, bool> canExcute;
        #endregion

        #region << Constructor >>
        public DeletegateCommand(Action excute)
            : this((o)=>excute(),(o)=>true)
        { }

        public DeletegateCommand(Action excute, Func<bool> canExcute)
            : this((o) => excute(), (o) => canExcute())
        { }

        public DeletegateCommand(Action<object> excute)
            : this(excute, (o) => true)
        { }

        public DeletegateCommand(Action<object> excute, Func<bool> canExcute)
            : this(excute, (o) => canExcute())
        { }

        public DeletegateCommand(Action<object> excute, Func<object, bool> canExcute)
        {
            this.excute = excute;
            this.canExcute = canExcute;
        }
        #endregion

        #region << Method >>
        public bool CanExecute(object parameter)
        {
            return canExcute(parameter);
        }

        public event EventHandler CanExecuteChanged
        {
            add
            {
                CommandManager.RequerySuggested += value;
            }
            remove
            {
                CommandManager.RequerySuggested -= value;
            }
        }

        public void Execute(object parameter)
        {
            excute(parameter);
        }
        #endregion
    }

    public class DeletegateCommand<T> : DeletegateCommand
    {
        #region << Constructor >>
        public DeletegateCommand(Action<T> excute)
            : this(excute, (o) => true)
        { }

        public DeletegateCommand(Action<T> excute, Func<bool> canExcute)
            : this(excute, (o) => canExcute())
        { }
        public DeletegateCommand(Action<T> excute,Func<T,bool> canExcute):base((o)=>excute((T)o),(o)=>canExcute((T)o))
        {
        }
        #endregion

        #region << Method >>
        public bool CanExecute(T parameter)
        {
            return base.CanExecute(parameter);
        }

        public void Execute(T parameter)
        {
            base.Execute(parameter);
        }
        #endregion
    }
}

 

上面是DelegateCommand的实现。下面是使用的代码。超级简约(只显示ViewModel,XAML的command的就不显示了)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication4
{
    public class MainWindowsViewModel
    {
        #region << Property >>
        public ICommand DemoCommand { get; set; }
        #endregion

        #region << Constructor >>
        public MainWindowsViewModel()
        {
            DemoCommand = new DeletegateCommand<string>(DemoMethod);
        }
        #endregion

        #region << Method >>
        public void DemoMethod(string input)
        {
            MessageBox.Show(input as string);
        }

        public bool CanDemoMethod()
        {
            return false;
        }
        #endregion

    }
}

 

 

 

posted @ 2013-02-12 20:26  qiurideyun  阅读(582)  评论(0编辑  收藏  举报