当前位置: 首页 > article >正文

【WPF命令绑定之--没有Command属性的控件如何进行命令绑定?】

前言

C#WPF之命令绑定

内容

有些控件不支持直接绑定命令,可以调用其他依赖实现命令的绑定。

依赖:Microsoft.Xaml.Behaviors.Wpf

使用如下代码可以实现事件的命令绑定,及传递参数:

1、引用:xmlns:behavior=“http://schemas.microsoft.com/xaml/behaviors”
2、添加命令绑定代码( 如:代码①)
3、创建实现ICommand 的类public class EventsCommand : ICommand(如代码②)
4、创建命令 public ICommand LoadedWindowCommand{ get; set; }
5、初始化命令、并创建方法(如:代码③)

其中代码①写在**.xaml窗体视图中。代码②单独创建类。命令的初始化及方法绑定是创建在视图对应的ViewModel中如代码③。

代码①
<!--绑定上下文-->
<Window.DataContext>
    <viewmodels:MainViewModel/>
</Window.DataContext>

<!--事件命令绑定-->
<behavior:Interaction.Triggers>
    <!--窗体加载命令绑定-->
    <behavior:EventTrigger EventName="Loaded">
        <behavior:InvokeCommandAction 
        	Command="{Binding LoadedWindowCommand}"   PassEventArgsToCommand="True"/>
    </behavior:EventTrigger>
    <!--窗体关闭命令绑定-->
    <behavior:EventTrigger EventName="Closing">
        <behavior:InvokeCommandAction 
        	Command="{Binding ClosingWindowCommand}" PassEventArgsToCommand="True"/>
    </behavior:EventTrigger>
</behavior:Interaction.Triggers>
代码②
public class EventsCommand<T> : ICommand
{
    private readonly Action<T> _execute;
    private readonly Func<T, bool> _canExecute;
    public EventsCommand(Action<T> execute, Func<T, bool> canExecute = null)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }
    public bool CanExecute(object parameter)
    {
        return _canExecute?.Invoke((T)parameter) ?? true;
    }
    public void Execute(object parameter)
    {
        _execute((T)parameter);
    }
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}
代码③
public class MainViewModel:INotifyPropertyChanged
{
	public ICommand LoadedWindowCommand { get; set; }
	public ICommand ClosingWindowCommand { get; set; }
	public MainViewModel()
	{
	    LoadedWindowCommand = new EventsCommand<object>(OnLoadedWindow);
		ClosingWindowCommand = new EventsCommand<object>(OnClosingWindow);
	}
	private void OnLoadedWindow(object e){}
	private void OnClosingWindow(object e){}
}

命令绑定例外

描述

有一种情况是控件里面添加控件,次数使用命令绑定传递参数。使用事件时,传递的一般是外层控件对象。

那么如何实现传递里面的对象呢,可以使用如下方法:使用DataContext数据上下文来传递。

<ScrollViewer Background="#AEAEAE" x:Name="RecordScrollViewer">
    <ListBox ItemsSource="{Binding ChatRecordCollection}" Margin="5">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <!-- 显示消息内容 -->
                <TextBlock Text="{Binding Data}"  Margin="10,0,0,0">
                    <behavior:Interaction.Triggers>
                        <!--鼠标点击命令事件-->
                        <behavior:EventTrigger EventName="PreviewMouseDown">
                            <behavior:InvokeCommandAction
                             Command="{Binding DataContext.ChatRecordMouseDownCommand, 
                                RelativeSource={RelativeSource AncestorType=ListBox}}"
                             CommandParameter="{Binding}"
                             PassEventArgsToCommand="True"/>
                        </behavior:EventTrigger>
                    </behavior:Interaction.Triggers>
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</ScrollViewer>

结语

以上是个人日常学习中学到的一下知识,和理解。


http://www.kler.cn/a/566573.html

相关文章:

  • (学习总结27)Linux工具:软件包管理器 yum、apt 和常用软件包下载安装介绍
  • 【大语言模型笔记进阶一步】提示语设计学习笔记,跳出框架思维,自己构建提示词
  • <tauri><rust><GUI>基于tauri,实现websocket通讯程序(右键菜单、websocket)
  • Unity中协程的使用场景
  • Oracle 基础概念及操作实战
  • 【Prometheus】prometheus服务发现与relabel原理解析与应用实战
  • 前端开发岗模拟面试题C
  • 【算法】双指针2816. 判断子序列
  • k8S通过代理将集群外的中间件引入集群内访问 —— 筑梦之路
  • GCN从理论到实践——基于PyTorch的图卷积网络层实现
  • Jetpack Architecture系列教程之(二)——Lifecycle生命周期感知
  • 【算法 位运算】801. 二进制中1的个数
  • Redis服务安装自启动(Windows版)
  • Redis拓展
  • 【Spring IoC】容器和IoC介绍以及IoC程序开发的优势
  • zswap 数据结构维护解析
  • SQL server配置ODBC数据源(本地和服务器)
  • 【Java项目】基于Spring Boot的闲一品交易系统
  • AI与机器学习、深度学习在气候变化预测中的应用
  • eBay封店潮深度解析:从IP隔离到合规运营的6步防御体系