RelayCommand命令

简介: 原文:http://www.cnblogs.com/xiepeixing/archive/2013/08/13/3255152.html   常用Wpf开发中我们在ViewModel中实现INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改...

原文:http://www.cnblogs.com/xiepeixing/archive/2013/08/13/3255152.html

 

常用Wpf开发中我们在ViewModel中实现INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改的目的;

在MVVMLight框架里,这里我们定义的ViewModel都继承自ViewModelBase,ViewModelBase封装在MvvmLight框架中,它已经实现了INotifyPropertyChanged接口,

因此我们在定义ViewModel属性时,只需要调用RaisePropertyChanged(PropertyName)就可以进行属性更改通知了。

 

 事件是WPF/SL应用程序中UI与后台代码进行交互的最主要方式,与传统方式不同,mvvm中主要通过绑定到命令来进行事件的处理,因此要了解mvvm中处理事件的方式,就必须先熟悉命令的工作原理。

一、RelayCommand命令

WPF/SL命令是通过实现 ICommand 接口创建的。 ICommand 公开两个方法(Execute 及 CanExecute)和一个事件(CanExecuteChanged)。 Execute 执行与命令关联的操作。CanExecute 确定是否可以在当前命令目标上执行命令。在MvvmLight中实现ICommand接口的类是RelayCommand,RelayCommand通过构造函数初始化Execute 和 CanExecute方法,因此,构造函数传入的是委托类型的参数,Execute 和 CanExecute则执行的是委托的方法,RelayCommand相关代码如下:

复制代码
        public RelayCommand(Action execute, Func<bool> canExecute)
        {
            if (execute == null)
            {
                throw new ArgumentNullException("execute");
            }

            _execute = execute;
            _canExecute = canExecute;
        }

        [DebuggerStepThrough]
        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute();
        }

        public void Execute(object parameter)
        {
            _execute();
        }
复制代码

二、 Comand属性绑定

简单的例子:一个TextBox和一个Button,TextBox非空内容时候Button才可用,可用的Button点击后把TextBox内容show出来。

复制代码
<Window x:Class="MVVMLightDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MVVMLightDemo.ViewModel"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:MainWindowViewModel></local:MainWindowViewModel>
    </Window.DataContext>
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding UserName, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
            <Button Content="show" Command="{Binding ShowCommand}" CommandParameter="{Binding UserName}"></Button>
        </StackPanel>
    </Grid>
</Window>
复制代码

ViewMode:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System.Windows.Input;
using System.Windows;
namespace MVVMLightDemo.ViewModel
{
    public class MainWindowViewModel:ViewModelBase
    {
        private string _UserName;

        public string UserName
        {
            get { return _UserName; }
            set { _UserName = value; RaisePropertyChanged("UserName"); }
        }
        public ICommand ShowCommand
        {
            get
            {
                return new RelayCommand<string>(
                    (user) => {
                        MessageBox.Show(user);
                    }, (user) =>
                    {
                        return !string.IsNullOrEmpty(user);
                    });

            }
        }
    }
}
复制代码
相关文章
|
JSON 移动开发 Java
氚云丨开发课— 09平台 API 的调用及自定义 API 的编写与调用| 学习笔记
快速学习氚云丨开发课— 09平台 API 的调用及自定义 API 的编写与调用。
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
1604 0
|
算法 测试技术 C++
C++算法 通配符匹配
C++算法 通配符匹配
|
SQL Java 数据库连接
一篇文章彻底理解数据库的各种 JDBC 超时参数 1
一篇文章彻底理解数据库的各种 JDBC 超时参数
|
9月前
|
C# 开发工具 C++
code runner 运行C#项目
本文介绍了如何修改Code Runner设置使 Visual Studio Code (VS Code) 能直接运行完整的 C# 项目。传统方式依赖 cscript 工具,仅支持 .csx 文件,功能受限且已停止维护。新配置使用 `dotnet run` 命令,结合一系列炫酷的cmd指令,将指令定位到具体的csproj文件上进行运行。
456 38
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android面试必问考点之一,如果你能把下面的一些事件分发图当场画出来肯定加分不少。废话不多说,总结一句:事件分发机制很重要。
384 9
|
消息中间件 Kafka 测试技术
Kafka常用命令大全及kafka-console-consumer.sh及参数说明
该文章汇总了Kafka常用命令,包括集群管理、Topic操作、生产者与消费者的命令行工具使用方法等,适用于Kafka的日常运维和开发需求。
3672 3
升级到jdk1.8后 sun/io/CharToByteConverter错误及处理
升级到jdk1.8后 sun/io/CharToByteConverter错误及处理
694 0
|
机器学习/深度学习 人工智能 自然语言处理
智能引领未来:精准选择与高效利用AI技术的实战指南
【7月更文第14天】在当今科技飞速发展的时代,人工智能(AI)已不再局限于科幻电影的想象,而是成为了推动各行各业革新升级的核心驱动力。从自动驾驶汽车到个性化推荐系统,从医疗诊断辅助到智能制造,AI正深刻改变着我们的生活和工作方式。然而,面对琳琅满目的AI技术和工具,如何精准选择并高效利用AI,成为企业和开发者亟需解决的关键问题。本文将为您揭示这一过程中的核心策略与实践技巧,并通过一个简单的代码示例,让您直观感受AI技术的魅力。
846 3
|
传感器 数据采集 监控
什么是物联网通信网关?
物联网通信网关是连接物联网设备与云或外部网络的关键桥梁。
1007 2