C# 命令绑定
在构建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# 命令绑定的更多相关文章
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- 【2016-11-15】【坚持学习】【Day26】【WPF 命令绑定到事件】
今天同事跟我说了已经有用的东西. System.Windows.Interativity 这个命名空间可以让我在界面上将命令绑定到对应的事件上.解决了我一直的疑问,只有点击事件可以绑定??现在有答案了 ...
- C#使用Xamarin开发可移植移动应用(3.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...
- C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 嗯..前面 ...
- 使用 MVVMLight 命令绑定(转)
继上一篇文章的项目,我们实现了数据绑定到界面中.这篇文章我们将实现把命令绑定到按钮上,在XAML中的Button之类的都会有个Command属性可以让我们来绑定命令使用. 首先我们要实现的目标是,在界 ...
- WPF中的命令与命令绑定导航
1.WPF中的命令与命令绑定(一) (引入命令) 2.WPF中的命令与命令绑定(二)(详细介绍命令和命令绑定)
- MVVM模式的命令绑定
命令绑定要达到的效果 命令绑定要关注的核心就是两个方面的问题,命令能否执行和命令怎么执行.也就是说当View中的一个Button绑定了ViewModel中一个命令后,什么时候这个Button是可用的, ...
- 使用 MVVMLight 命令绑定
首先,如果您希望了解更多的MVVMLight技术或希望有顺序的学习MVVMLight,请查阅目录<MVVMLight 设计模式系列使用文章>. 继上一篇文章的项目,我们实现了数据绑定到界面 ...
- PIE SDK图层树右键菜单与命令绑定
1. 功能简介 上一节已经介绍过图层树如何和地图和制图关联,图层树右键菜单主要是基于TocControl控件进行对菜单节点进行控制,TocControl主要作用是显示当前加载的图层有哪些.采用什么 ...
- WPF中的命令与命令绑定(二)
原文:WPF中的命令与命令绑定(二) WPF中的命令与命令绑定(二) 周银辉在WPF中,命令(Commandi ...
随机推荐
- python(pymysql)之mysql简单操作
一.mysql简单介绍 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库 ...
- CSS之圣杯布局与双飞翼布局
圣杯布局 三行等高 HTML: <!DOCTYPE html><html><head> <meta charset="utf-8"& ...
- Unity Shader——Writing Surface Shaders(3)——Surface Shader Lighting Examples
Surface Shader 光照例子 这里有一些自定义光照模型和Surface Shaders的例子.通常的Surface Shader例子在这里. 由于延迟光照在某些自定义的逐材质光照模型中表现得 ...
- spring mvc 4数据校验 validator
注解式控制器的数据验证.类型转换及格式化——跟着开涛学SpringMVC http://jinnianshilongnian.iteye.com/blog/1733708Spring4新特性——集成B ...
- Java注释Override、Deprecated、SuppressWarnings详解(过时方法,即将删除的方法或成员变量)
Override 这个注释的作用是标识某一个方法是否覆盖了它的父类的方法.那么为什么要标识呢?让我们来看看如果不用Override标识会发生什么事情. Deprecated 这个注释是一个标记注释.所 ...
- Java开发常用Linux命令
1.查找文件 find / -name filename.txt根据名称查找/目录下的filename.txt文件. find . -name "*.xml"递归查找所有的xml文 ...
- 黄聪:MySQL 按指定字段自定义列表排序
问题描述 大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例, 下同): SELECT * FROM `MyTable` , , , ) ORDER BY `id` ASC ...
- ASP.NET MVC IOC 之AutoFac攻略
一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~ Autofa ...
- codeforces 689 E. Mike and Geometry Problem 组合数学 优先队列
给定一个函数: f([l,r]) = r - l + 1; f(空集) = 0; 即f函数表示闭区间[l,r]的整点的个数 现在给出n个闭区间,和一个数k 从n个区间里面拿出k个区间,然后对这k个区间 ...
- 透明(颜色)渐变背景(颜色透明背景),兼容IE8
filter: progid:DXImageTransform.Microsoft.gradient (GradientType=0, startColorstr=#00000000, endColo ...