WPF学习08:MVVM 预备知识之COMMAND

WPF内建的COMMAND是GOF 提出的23种设计模式中,命令模式的实现。

本文是WPF学习07:MVVM 预备知识之数据绑定的后续,将说明实现COMMAND的三个重点:ICommand  CommandManager InputBindings

COMMAND简介

一般情况我们应用设计如下,一个个控件的各类Handler直接关心了如何实现具体的应用逻辑。

借助COMMAND,我们将具体实现的应用逻辑放在COMMAND中实现,控件只需要绑定相应的COMMAND,而无需关心应用逻辑,从而实现界面与应用逻辑的解耦。

WPF内建的COMMAND除了提供了逻辑解耦外,还可以用来实现控件使能管理、命令的历史记录(使操作可撤销)。

本文将介绍如何在MVVM下运用COMMAND,以及控件的使能管理。历史记录功能将在下篇学习笔记中再介绍。


例子

由CheckBox 管理Command是否可以被执行,Ctrl + A与按键被按均能执行同样的业务逻辑。

XAML代码:

<Window x:Class="Commands.CommandBlog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CommandBlog" Height="300" Width="300">
    <Window.InputBindings>
        <KeyBinding Key="A" Modifiers="Control" Command="{Binding NewFile}"></KeyBinding>
    </Window.InputBindings>
    <StackPanel Background="White">
        <Button Command="{Binding NewFile}">New file</Button>
        <CheckBox IsChecked="{Binding NewFileEnable}" HorizontalAlignment="Center">New file Function Enable</CheckBox>
    </StackPanel>
</Window>
 

界面部分后台代码,只需要配置DataContext即可:

public partial class CommandBlog : Window
{
    public CommandBlog()
    {
        InitializeComponent();
        DataContext = new CommandBlogViewModel();
    }
}

CommandBlogViewModel:

class CommandBlogViewModel:INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public ICommand NewFile
    {
        get;
        private set;
    }

    public CommandBlogViewModel()
    {
        NewFile = new NewFileCommand(this);
    }

    private Boolean newFileEnable;

    public Boolean NewFileEnable
    {
        get { return newFileEnable; }
        set
        {
            newFileEnable = value;
            if (PropertyChanged != null)
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs("NewFileEnable"));
        }
    }
}

NewFileCommand:

class NewFileCommand : ICommand
{
    private CommandBlogViewModel commandBlogViewModel;

    public NewFileCommand(CommandBlogViewModel commandBlogViewModel)
    {
        this.commandBlogViewModel = commandBlogViewModel;
    }

    public bool CanExecute(object parameter)
    {
        return this.commandBlogViewModel.NewFileEnable;
    }

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

    public void Execute(object parameter)
    {
        MessageBox.Show("New");
    }
}

ICommand

// Summary:
//     Occurs when changes occur that affect whether or not the command should execute.
event EventHandler CanExecuteChanged;

// Summary:
//     Defines the method that determines whether the command can execute in its
//     current state.
bool CanExecute(object parameter);
// Summary:
//     Defines the method to be called when the command is invoked.
void Execute(object parameter);

CanExecute与Execute的意思都很明显,可以在刚才的例子中看出来。这里重点介绍一下如何给它们传参。

我们可以通过设置CommandParameter向两者传参:
    例子:

<!--主窗体起名为MainWindow-->
<Button Command="{Binding NewFile}" CommandParameter="{Binding ElementName=MainWindow}">New file</Button>
public void Execute(object parameter)
{
    var inputElement = parameter as IInputElement;
    if (inputElement!= null)
    {
        var pos = Mouse.GetPosition(inputElement);
    }
}

CommandManager

为了使WPF能够自动识别CanExecute的变化,我们需要手动对CanExecuteChanged加以下代码:

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

InputBindings

当我们希望可以自定义命令的输入映射时,需要用到InputBindings:

例子:

<Window.InputBindings>
    <KeyBinding Key="A" Modifiers="Control" Command="{Binding NewFile}"></KeyBinding>
    <KeyBinding Key="C" Modifiers="Control" Command="{Binding CopyContent}"></KeyBinding>
    <KeyBinding Key="V" Modifiers="Control" Command="{Binding PasteContent}"></KeyBinding>
    <KeyBinding Key="F1" Modifiers="Control" Command="{Binding HelpPrompt}"></KeyBinding>
</Window.InputBindings>
时间: 2024-10-13 09:36:25

WPF学习08:MVVM 预备知识之COMMAND的相关文章

WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参

原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataContext,所以如果要绑定父级的DataContext,直接DataContext=“{Binding}”是行不通的 不能绑父级,但是能绑资源 第一步:定义一个中间类用来做资源对象 1 public class BindingProxy : Freezable 2 { 3 #region Over

WPF学习07:MVVM 预备知识之数据绑定

MVVM是一种模式,而WPF的数据绑定机制是一种WPF内建的功能集,两者是不相关的. 但是,借助WPF各种内建功能集,如数据绑定.命令.数据模板,我们可以高效的在WPF上实现MVVM.因此,我们需要对各种MVVM相关的WPF内建功能集进行了解,才能在扎实的基础上对MVVM进行学习与实践. 本文是WPF学习03:Element Binding的后续,将说明实现数据绑定的三个重点:DataContext INotifyPropertyChanged IValueConverter MVVM简介 MV

WPF学习之路(六)Command

在WPF中,命令绑定机制是相比于事件更高级的概念,把应用程序的功能划分为多个任务,任务由多种途径触发. 应用Command Binding使代码更符合MVVM模式(Model-View-ViewModel),类似于MVC模式(Model-View-Control).这两种模式在以后的BLOG中会有详细的介绍.目的都是为了更好的分离前后台逻辑. 一个简单的Button <Button Content="Button" Click="Button_Click" /

java学习的一些预备知识和一些简单的java小程序

1先了解一些基本的dos命令 dir     ·列出当前目录下的文件和文件夹 md      创建文件夹 rd        删除文件夹(文件下没有子文件) del "文件夹名"    可以删除带子文件的文件夹 cd..    使文件夹目录一层一层后退 cd\    回到根目录 haha>1.txt    创建文档,并将haha写入到1.txt文档中 del 1.txt    删除文件(不走回收站) del  *.txt    只删除txt文件 exit    退出命令行 set

[傅里叶变换及其应用学习笔记] 一. 预备知识

这份是本人的学习笔记,课程为网易公开课上的斯坦福大学公开课:傅里叶变换及其应用. 本课程学习路线: 从傅里叶级数开始,后续过渡到傅里叶变换. 扼要描述 傅里叶级数(fourier series),几乎等同于周期性现象的学习. 傅里叶变换(fourier transform),可作为傅里叶级数的极限情况,是对非周期性现象的数学分析. 两者间的共同点 分析(analysis),分解一个信号(函数),把它拆分成一系列组成部分,并希望这些组成部分比复杂的原始信号(函数)简单. 合成(synthesis)

WPF学习09:数据绑定之 Binding to List Data

从WPF学习03:Element Binding我们可以实现控件属性与控件属性的绑定. 从WPF学习07:MVVM 预备知识之数据绑定 我们可以实现控件属性与自定义对象属性的绑定. 而以上两个功能在实际应用中还是不够的,我们经常需要将列表数据与控件属性进行绑定. 例子 ListBox切换人物,下面两个文本框跟随切换,很常用的功能. XAML代码: <Window x:Class="DataTemplate.MainWindow" xmlns="http://schema

android金阳光自动化测试——学习历程:自动化预备知识上&amp;&amp;下

章节:自动化基础篇——自动化预备知识上&&下 网易云课堂: 上:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877113&courseId=712011 下:http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877114&courseId=71

WPF学习10:基于MVVM Light 制作图形编辑工具(1)

图形编辑器的功能如下图所示: 除了MVVM Light 框架是一个新东西之外,本文所涉及内容之前的WPF学习0-9基本都有相关介绍. 本节中,将搭建编辑器的界面,搭建MVVM Light 框架的使用环境. 界面 <Window x:Class="GraphEditor.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http:

WPF学习11:基于MVVM Light 制作图形编辑工具(2)

本文是WPF学习10:基于MVVM Light 制作图形编辑工具(1)的后续 这一次的目标是完成 两个任务. 画布 效果: 画布上,选择的方案是:直接以Image作为画布,使用RenderTargetBitmap绑定为Image的图片源,这样可以为后续的导出图片功能提供很大的便利. 对拖动栏XAML进行如下修改: <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="