Command的定义和应用

来源:互联网 发布:爱情动作片软件 编辑:程序博客网 时间:2024/05/18 18:45
一、Command的定义

1)自定的Command都要实现这个接口
 public interface ICommand
    {
        //当出现影响是否应执行该命令的更改时发生。
        event EventHandler CanExecuteChanged;

        //定义用于确定此命令是否可以在其当前状态下执行的方法。        
        bool CanExecute(object parameter);
      
        //定义在调用此命令时调用的方法。
        void Execute(object parameter);
    }

2)定义命令
public class SettingCommand :ICommand
    {
        private event Action method;//这里定义了命令的执行逻辑,是命令最关键的地方
        public SettingCommand(Action action)
        {
            this.method = action;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

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

        public void Execute(object parameter)
        {
            //这里把command的逻辑以事件的形式对外公布
            //是为了把代码逻辑和业务分开
            if (method != null)
                method();
        }
    }   

3)定义命令的集合体
    public class ItemViewModel
    {   
        private SettingCommand editPlan;//编辑
        private SettingCommand deletePlan;//删除
        private SettingCommand showPlan;//浏览

        public event Action<string> OnEditClicked;
        public event Action<string> OnDeleteClicked;
        public event Action<string> OnShowClicked;

        public SettingCommand ShowPlan
        {
            get 
            {
                if (showPlan == null)
                    showPlan = new SettingCommand(Show);

                return showPlan;
            }
        }
      
        public SettingCommand EditPlan
        {
            get
            {
                if (editPlan == null)
                    editPlan = new SettingCommand(Edit);

                return editPlan;
            }
        }
        public SettingCommand DeletePlan
        {
            get 
            {
                if (deletePlan == null)
                    deletePlan = new SettingCommand(Delete);

                return deletePlan;
            }
        }

        private void Show() 
        {
            if (OnShowClicked != null)
                OnShowClicked(id);
        }

        private void Edit()
        {
            if (OnEditClicked != null)
                OnEditClicked(id);
        }

        private void Delete()
        {
            if (OnDeleteClicked != null)
                OnDeleteClicked(id);
        }
    }

4)实例化一个命令集合
        ItemViewModel ivm = new ItemViewModel();
        ivm.OnShowClicked += (id) =>  { Show(id); }  //浏览
        ivm.OnEditClicked += (id) => { Edit(id); } //编辑
        ivm.OnDeleteClicked += (id) => { Delete(id); } //删除


二、Command的应用

像平板电脑的菜单那样,展开菜单的时候,上面有查看、编辑、删除几个按钮。在WPF里面,一个按钮就搞定了,不过要花点功夫把按钮模板改写一下。改写模板,在模板里面放多三个按钮。然后实例化一个命令集合实体,把里面的command跟模板里面的按钮一一对应上就好了。

1)按钮模板
     <ControlTemplate x:Key="ctChoose" TargetType="RadioButton">
        <Border x:Name="bg" Height="40" BorderBrush="Transparent" BorderThickness="1" Opacity="0.6" Background="Transparent">
            <Grid Height="40">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="10"/>
                </Grid.ColumnDefinitions>
                <Button Grid.ColumnSpan="5" x:Name="btn"  Content="{TemplateBinding Content}" />
                <Button Grid.Column="1" x:Name="btnShow" Opacity="0" Command="{Binding ShowPlan}"  Margin="3" />
                <Button Grid.Column="2" x:Name="btnEdit" Opacity="0" Command="{Binding EditPlan}"  Margin="3" />
                <Button Grid.Column="3" x:Name="btnDel" Opacity="0" Command="{Binding DeletePlan}" Margin="3" />              
            </Grid>
        </Border>      
    </ControlTemplate>

2)应用模板<RadioButton x:Name="radioButton" Content="名字不是很长不是很长" Template={StaticResource ctChoose} />

3)实例化一个命令集合实体,把它指定给radioButton作为DataContext就行了。

代码可以去这里下载:http://download.csdn.net/detail/so_lazy/6657379
如果你看了,欢迎给建议。
0 0
原创粉丝点击