wpf学习笔记 Command

Command是事件的进化体,Wpf中可以将Command绑定到控件上,减少重复的事件代码。它的方便在于可以直接在ui进行操作,并在逻辑中使命令不可用。

微软为wpf内置了不少默认命令,诸如paste、copy、save等。下面的代码演示了一个简单的记事本程序。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Menu Grid.Column="0">
            <MenuItem Command="Save" x:Name="menuSave" Header="Save"></MenuItem>
        </Menu>
        <TextBox x:Name="tbx" Grid.Row="1"></TextBox>
    </Grid>
    <Window.CommandBindings>
        <CommandBinding Command="Save" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" ></CommandBinding> 

</Window.CommandBindings>

 在后台,实现了CanExecute和Executed的方法。

   private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            
            if ( tbx.Text != "")
            {
                e.CanExecute = true;
            }
            else
            {
                e.CanExecute = false;
            }
        }

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
             // 保存文件对话框
       SaveFileDialog save = new SaveFileDialog();
       save.Filter = "文本文件|*.txt|所有文件|*.*";
    
       bool? result = save.ShowDialog();
       if (result.Value)
       {
           // 执行保存文件操作
       }

但是内置的毕竟比较少,我们可以继承ICommand接口来自定义Command,在ICmmand中,包含CanExecute和Executed成员,我们在DelegateCommand类中实现他们。

public class DelegateCommand<T> : ICommand
    {
        private readonly Action<T> executeAction;
        private readonly Func<T, bool> canExecuteAction;
        public event EventHandler CanExecuteChanged;
        public DelegateCommand(Action<T> executeAction)
            : this(executeAction, null)
        {
        }
        public DelegateCommand(Action<T> executeAction,
            Func<T, bool> canExecuteAction)
        {
            this.executeAction = executeAction;
            this.canExecuteAction = canExecuteAction;
        }
        public bool CanExecute(object parameter)
        {
            return canExecuteAction==null ? true:canExecuteAction((T)parameter);
        }
        public void Execute(object parameter)
        {
            if (CanExecute(parameter))
            {
                executeAction((T)parameter);
            }
        }

  我们可以很方便地将command绑定到ui元素上,实现ui与逻辑的分离。

源码下载:/Files/shen6041/Command.zip 

 

 

 

 

 

posted @ 2012-03-05 21:14  shen6041  阅读(711)  评论(0编辑  收藏  举报