关于WPF中Command绑定传参数以及将命令绑定到其它事件的方法

这篇具有很好参考价值的文章主要介绍了关于WPF中Command绑定传参数以及将命令绑定到其它事件的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:在WPF中,将命令绑定到一个Button的Command属性中是非常简单的事情,例如:

<Button Content="单击命令" Command="{Binding ClickCommand}"/>

但是很多时候,我们要实现其它事件的命令绑定,以此实现彻底的MVVM开发模式,那就得用到微软另外一个神器了!它就是程序集System.Windows.Interactivity,在网上可以下载System.Windows.Interactivity.dll这个库文件。

当然,在mvvmlight中,已经集成了这个库文件,所以我们新建一个WPF项目后,通过“管理Nuget程序包"下载安装mvvmlight到项目中后,就可以直接使用了,mvvmlight组件是WPF常见开发包,它提供了一个GalaSoft.MvvmLight.Command命令空间,其中有RelayCommand和RelayCommand<T>两个类扩展了ICommand接口,特别是RelayCommand<T>类,它能实现参数传递。

比如我们有一个ComboBox控件,当用户在UI端选定某个子项后,要将选定的值传入到ViewModel中,这里就需要将ComboBox的SelectionChanged事件绑定到一个命令(SelectionComboBoxCommand),绑定的同时可将当前这个ComboBox控件作为参数传递给SelectionComboBoxCommand命令,这样就可以在ViewModel中去作处理了,那么具体的操作怎么实现呢?

首先是前端代码:

<ComboBox>
  <i:Interaction.Triggers>
      <i:EventTrigger EventName="SelectionChanged">
          <i:InvokeCommandAction Command="{Binding SelectionComboBoxCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ComboBox}}"/>
      </i:EventTrigger>
  </i:Interaction.Triggers>
  <ComboBoxItem Content="张三"/>
  <ComboBoxItem Content="李四"/>
  <ComboBoxItem Content="王五"/>
</ComboBox>

这里就使用了System.Windows.Interactivity这个空间的Interaction.Triggers,将ComboBox的SelectionChanged事件传递到SelectionComboBoxCommand命令中,在后端,SelectionComboBoxCommand定义成泛型,接收前端传入的ComboBox控件

/// <summary>
/// 获取ComboBox的选定项
/// </summary>
public RelayCommand<ComboBox> SelectionComboBoxCommand
{
    get
    {
        var command = new RelayCommand<ComboBox>((control) =>
        {
            var item = control.SelectedItem as ComboBoxItem;
            if (item != null)
                messages.Add($"({item.Content})[{DateTime.Now}]");
        });
        return command;
    }
}

如此,就可以拿到ComboBox的SelectedItem ,并进行相应的处理了。本例中还展示了Microsoft.Practices.Prism空间中的DelegateCommand类的用法,和mvvmlight中的RelayCommand一样

/// <summary>
/// 获取ComboBox的选定项
/// </summary>
public DelegateCommand<ComboBox> SelectionComboBoxCommand2
{
    get
    {
        var command = new DelegateCommand<ComboBox>((control) =>
        {
            var item = control.SelectedItem as ComboBoxItem;
            if (item != null)
                messages.Add($"({item.Content})[{DateTime.Now}]");
        });
        return command;
    }
}

完整的代码如下:

前端代码

<Window x:Class="WpfCommands.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfCommands" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        mc:Ignorable="d" DataContext="{Binding Source={StaticResource Locator},Path=Main}"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <StackPanel>
            <Button Content="单击命令" Command="{Binding ClickCommand}"/>
            <Button Content="单击命令带参数" Command="{Binding ClickWithButtonCommand}"  CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}}"/>
            <TextBox>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="GotFocus">
                        <i:InvokeCommandAction Command="{Binding GotFocusWithTextBoxCommand }" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=TextBox}}"/>
                    </i:EventTrigger>
                    <i:EventTrigger EventName="TextChanged">
                        <i:InvokeCommandAction Command="{Binding ChangedTextBoxCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=TextBox}}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </TextBox>
            <ComboBox>
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SelectionChanged">
                        <i:InvokeCommandAction Command="{Binding SelectionComboBoxCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ComboBox}}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
                <ComboBoxItem Content="张三"/>
                <ComboBoxItem Content="李四"/>
                <ComboBoxItem Content="王五"/>
            </ComboBox>
        </StackPanel>
        <ListBox Grid.Column="1" ItemsSource="{Binding Messages}"/>
    </Grid>
</Window>

ViewModel代码

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using Microsoft.Practices.Prism.Commands;
using System;
using System.Collections.ObjectModel;
using System.Windows.Controls;

namespace WpfCommands.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        public MainViewModel()
        {

        }

        private ObservableCollection<string> messages = new ObservableCollection<string>();
        /// <summary>
        /// 运行提示
        /// </summary>
        public ObservableCollection<string> Messages
        {
            get { return messages; }
            set { messages = value; RaisePropertyChanged("Messages"); }
        }

        /// <summary>
        /// 单击命令
        /// </summary>
        public RelayCommand ClickCommand
        {
            get
            {
                var command = new RelayCommand(() =>
                {
                    messages.Add($"您单击了[{DateTime.Now}]");
                });
                return command;
            }
        }

        /// <summary>
        /// 单击命令带参数
        /// </summary>
        public RelayCommand<Button> ClickWithButtonCommand
        {
            get
            {
                var command = new RelayCommand<Button>((button) =>
                {
                    messages.Add($"您单击了({button.Content})[{DateTime.Now}]");
                });
                return command;
            }
        }

        /// <summary>
        /// TextBox获得焦点
        /// </summary>
        public RelayCommand<TextBox> GotFocusWithTextBoxCommand
        {
            get
            {
                var command = new RelayCommand<TextBox>((textbox) =>
                {
                    messages.Add($"({textbox.Name})获得焦点[{DateTime.Now}]");
                });
                return command;
            }
        }

        /// <summary>
        /// TextBox内容被修改
        /// </summary>
        public RelayCommand<TextBox> ChangedTextBoxCommand
        {
            get
            {
                var command = new RelayCommand<TextBox>((textbox) =>
                {
                    messages.Add($"({textbox.Text})[{DateTime.Now}]");
                });
                return command;
            }
        }

        /// <summary>
        /// 获取ComboBox的选定项
        /// </summary>
        public RelayCommand<ComboBox> SelectionComboBoxCommand
        {
            get
            {
                var command = new RelayCommand<ComboBox>((control) =>
                {
                    var item = control.SelectedItem as ComboBoxItem;
                    if (item != null)
                        messages.Add($"({item.Content})[{DateTime.Now}]");
                });
                return command;
            }
        }


        /// <summary>
        /// 获取ComboBox的选定项
        /// </summary>
        public DelegateCommand<ComboBox> SelectionComboBoxCommand2
        {
            get
            {
                var command = new DelegateCommand<ComboBox>((control) =>
                {
                    var item = control.SelectedItem as ComboBoxItem;
                    if (item != null)
                        messages.Add($"({item.Content})[{DateTime.Now}]");
                });
                return command;
            }
        }

    }
}

关于WPF中Command绑定传参数以及将命令绑定到其它事件的方法
源码下载

下面为新增自定义控件及控件行为附加示例
关于WPF中Command绑定传参数以及将命令绑定到其它事件的方法

附带升级版源码(增加自定义控件中自定义事件的命令绑定和控件行为扩展示例)

作者:WPF中文网文章来源地址https://www.toymoban.com/news/detail-502034.html

到了这里,关于关于WPF中Command绑定传参数以及将命令绑定到其它事件的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WPF实现更加灵活绑定复杂Command(使用Microsoft XAML Behaviors 库)

    1、安装NuGet          2、在XAML的命名空间引入: 3、使用(这里是设置了一个Canvas的点击事件,其它面板也是类似这样设置):         --我这里的ViewModel部分是这样子的 4、这样就可以在ViewModel中直接给这个Command内容了,不用像之前那么麻烦地绑定Command了,这样更加清晰,

    2024年02月04日
    浏览(49)
  • WPF 如何实现事件绑定 (MVVM)

    首先说到绑定,一般是在WPF 中常见的,因为WPF中有一个比较好用的框架叫做 MVVM 所以View层的按钮等元件的的动作都是需要和后台ViewModel 中的函数进行绑定的。 如 我们最常见的按钮的command 绑定 这里面的command 是命令,不是事件 如果点击图片,或者按钮抬起来的时候需要触

    2024年02月04日
    浏览(54)
  • WPF 绑定binding都有哪些事件

    主要包含以下几个事件: 1. UpdateSourceTrigger:用于控制数据绑定如何更新源数据的事件 PropertyChanged:每当目标属性的值更改时,将立即更新源属性。 LostFocus:当目标元素失去焦点时,更新源属性。 Explicit:只有在调用BindingExpression.UpdateSource方法时才会更新源属性。 Default:与

    2024年02月05日
    浏览(56)
  • WPF 控件CommandParameter绑定多个参数

    新建一个类,继承IMultiValueConverter xaml中添加引用 xmlns:{wpfbd}=\\\"clr-namespace:{新建类所在的命名空间}\\\" 添加完重新生成一次 添加资源 为控件添加参数 在View Model中使用多个参数

    2024年02月09日
    浏览(41)
  • 如何让WPF中的ValidationRule实现参数绑定

    应用开发过程中,常常会对用户输入内容进行验证,通常是基于类型、范围、格式或者特定的要求进行验证,以确保输入符合预期。例如邮箱输入框校验输入内容是否符合邮箱格式。在WPF中,数据模型允许将 ValidationRules 与 Binding 对象关联,可以通过继承 ValidationRule 类并重写

    2024年02月12日
    浏览(42)
  • VScode Invoke-Expression: 无法将参数绑定到参数“Command”,因为该参数为空字符串

    打开vscode时发生错误:Invoke-Expression : 无法将参数绑定到参数“Command”,因为该参数为空字符串。 解决办法:在anaconda prompt base中输入:

    2024年02月07日
    浏览(34)
  • C#WPF命令Command使用实例

    本文实例演示C#WPF命令使用实例 定义: 命令(Command):命令表示一个任务单元,并且可跟踪该任务的状态,实际上是实现了ICommand接口的类。然而,命令实际上可以包括任务执行的逻辑代码,也可以不包括从而仅作为联系命令源与命令目标的媒介。比如,WPF 默认的接口实现

    2024年02月07日
    浏览(34)
  • C# WPF数据绑定方法以及重写数据模板后数据绑定

    写在前面 本文将会介绍WPF如何 实现前后端数据绑定 和在进行 数据绑定时常用的方法和类 以及对于DataGrid、ListView这样的控件 重写数据模板后控件如何进行数据绑定 。 本文主要针对于数据绑定的基础实现进行介绍,通过此博文你将会有能力编写一个MVVM设计模式的C#、WPF项目

    2023年04月17日
    浏览(45)
  • 【WPF】异步任务更新UI、绑定命令、绑定字符串属性

    WPF异步任务 主界面 在视图模型中定义命令: 在主界面xaml中绑定命令:  创建命令实例:

    2024年02月09日
    浏览(61)
  • WPF浮窗Popup控件与命令Command简单使用

    上面是WPF前端代码,其中图片Image要自己在项目下新建一个Resource文件夹把图片添加进去,WPF后台窗体代码为: 在另外新建一个类,俗称MVVM模式中的VM文件,文件暂时命名为MainWindowVM,类文件内容如下: 值得注意的是要引用包CommonServiceLocator,操作如下:右击项目名-属性-NuGet管理包,检索包

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包