在构建WinForm程序中,为了使系统的结构清晰,有好的用户交互体验,实现不同按钮之间的交互,不使主窗体里面的代码臃肿。将按钮的命令通过类进行绑定,实现命令的管理使很有必要的。

该文章是将如何实现Button的按钮事件绑定的。

1、新建WinForm程序

2、添加3个Button按钮,如下图所示

3、新建ICommand.cs接口,代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace commandTest
{
//命令接口
public interface ICommand
{
void OnClick();
void New();
void Refresh();
}
}

4、新建命令管理类CommandUnitily.cs,代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace commandTest
{
class CommandUnitily
{
//创建命令集合
private static List<ICommand> cmds = new List<ICommand>(); //将命令添加到集合里面
public static void CmdRegist(ICommand cmd)
{
cmds.Add(cmd);
}
//刷新所有命令,用于命令直接的相互影响
public static void AllRefresh()
{
foreach (ICommand cmd in cmds)
{
cmd.Refresh();
}
}
}
}

5、新建Button按钮通用类ButtonTool.cs,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace commandTest
{
//button控件公用类,继承自ICommand接口
class ButtonTool : ICommand
{
private Button bt; void bt_Click(object sender, EventArgs e)
{
OnClick();
CommandUnitily.AllRefresh();//所有按钮都刷新,包括按钮本身
}
//使用virtual关键词之后,调用OnClick方法之后,
//会调用派生类(举例:Button1Click)中的OnClick,
//从而实现各自的button点击事件
public virtual void OnClick()
{
Console.WriteLine("点击button事件");
} public void New(Button but)
{
bt = but;
bt.Click += new EventHandler(bt_Click);
} public void Refresh()
{
Console.WriteLine(bt.Name+"刷新");
} public void New()
{
throw new NotImplementedException();
}
}
}

6、创建Button1Click.cs点击类,代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace commandTest
{
//创建Button1事件执行类,继承自ButtonTool
class Button1Click : ButtonTool
{
public Button1Click(Button obj)
{
Console.WriteLine("button1注册成功");
this.New(obj);
}
//重写ButtonTool类的OnClick方法,用于实现Button1的点击事件
public override void OnClick()
{
base.OnClick();
Console.WriteLine("点击button1事件");
}
} }

7、主窗体Form.cs代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace commandTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
CommandUnitily.CmdRegist(new Button1Click(button1));
  Console.WriteLine("窗体加载完毕");
}
}
}

8、文件结构如下:

9、测试

从窗体加载到点击button1测试的结果如下图:

可以借鉴Button1Click.cs类实现button2和button3的按钮点击事件

源代码:http://pan.baidu.com/s/1eSwoh5C

C# 命令绑定的更多相关文章

  1. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. 【2016-11-15】【坚持学习】【Day26】【WPF 命令绑定到事件】

    今天同事跟我说了已经有用的东西. System.Windows.Interativity 这个命名空间可以让我在界面上将命令绑定到对应的事件上.解决了我一直的疑问,只有点击事件可以绑定??现在有答案了 ...

  3. C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码

    前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...

  4. C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码

    前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...

  5. 使用 MVVMLight 命令绑定(转)

    继上一篇文章的项目,我们实现了数据绑定到界面中.这篇文章我们将实现把命令绑定到按钮上,在XAML中的Button之类的都会有个Command属性可以让我们来绑定命令使用. 首先我们要实现的目标是,在界 ...

  6. WPF中的命令与命令绑定导航

    1.WPF中的命令与命令绑定(一) (引入命令) 2.WPF中的命令与命令绑定(二)(详细介绍命令和命令绑定)

  7. MVVM模式的命令绑定

    命令绑定要达到的效果 命令绑定要关注的核心就是两个方面的问题,命令能否执行和命令怎么执行.也就是说当View中的一个Button绑定了ViewModel中一个命令后,什么时候这个Button是可用的, ...

  8. 使用 MVVMLight 命令绑定

    首先,如果您希望了解更多的MVVMLight技术或希望有顺序的学习MVVMLight,请查阅目录<MVVMLight 设计模式系列使用文章>. 继上一篇文章的项目,我们实现了数据绑定到界面 ...

  9. PIE SDK图层树右键菜单与命令绑定

    1.   功能简介 上一节已经介绍过图层树如何和地图和制图关联,图层树右键菜单主要是基于TocControl控件进行对菜单节点进行控制,TocControl主要作用是显示当前加载的图层有哪些.采用什么 ...

  10. WPF中的命令与命令绑定(二)

    原文:WPF中的命令与命令绑定(二) WPF中的命令与命令绑定(二)                                              周银辉在WPF中,命令(Commandi ...

随机推荐

  1. hmtl初学

    hmtl+css实现小车轮子转动! <!DOCTYPE html>   <html>   <head lang="en">   <meta ...

  2. 关于tomcat7下websocket不能使用

    tomcat启动时提示 信息: JSR 356 WebSocket (Java WebSocket 1.0) support is not available when running on Java ...

  3. DB_MYSQL_mysql-5.7.10-winx64解压版安装笔记

    1.http://dev.mysql.com/downloads/mysql/ 里面下载Windows (x86, 64-bit), ZIP Archive mysql-5.7.10-winx64.z ...

  4. Unity2D多分辨率屏幕适配方案(转载)

    一下内容转自:http://imgtec.eetrend.com/forum/3992 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有 ...

  5. UDP发送数据测试

    一个合作伙伴说UDP发送数据,A(IP:192.168.1.100 子网掩码255.255.255.0)网段能发数据到B网段,但B(IP:192.168.2.100 子网掩码255.255.255.0 ...

  6. SpringMVC 中获取所有的路由配置。

    ApplicationContext context = TMSContextLookup.getApplicationContext(); String[] controllerList = con ...

  7. const,static,volatile

    1.static 作用 在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.2). 在模块内(但在函数体外),一个被声明为静态的 ...

  8. 解决Tomcat catalina.out 不断成长导致档案过大的问题

    Tomcat的网站上的说法http://wiki.apache.org/tomcat/FAQ/Logging#Q6: System.out 和 System.err 都被打印到 catalina.ou ...

  9. Json数据处理

    1.字符串转换为Json数组:取json对象属性值. String st="[{"tradeDate":"2016-09-27","trad ...

  10. NBU恢复报:ORA-19554 ORA-27211

    RMAN> run {2> allocate channel ch00 type 'sbt_tape' parms='ENV=(NB_ORA_CLIENT=rac1)';3> res ...