【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中如代码③。

代码①
csharp 复制代码
<!--绑定上下文-->
<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>
代码②
csharp 复制代码
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; }
    }
}
代码③
csharp 复制代码
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数据上下文来传递。

csharp 复制代码
<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>

结语

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

相关推荐
大王小生12 小时前
说说CSV文件和C#解析csv文件的几种方式
人工智能·c#·csv·csvhelper·csvreader
LongtengGensSupreme14 小时前
C# 中监听 IPv6 回环地址----HttpListener
c#·ipv6·httplistener
zzcufo16 小时前
多邻国学习笔记第五阶段第10-11部分
笔记·学习·c#
easyboot1 天前
C#使用pythonnet简单示例
开发语言·python·c#
刘欣的博客1 天前
c# winform 控件dock 停造位置、摆放顺序问题
c#·winform·dock停靠问题
Java程序员威哥1 天前
Arthas+IDEA实战:Java线上问题排查完整流程(Spring Boot项目落地)
java·开发语言·spring boot·python·c#·intellij-idea
easyboot1 天前
C#通过sqlsugar插入数据到postgresql
开发语言·c#
阿蒙Amon1 天前
C#每日面试题-break、continue和goto的区别
java·面试·c#
小北方城市网1 天前
Spring Cloud Gateway 生产级实践:高可用架构、灰度发布与故障排查
spring boot·redis·分布式·缓存·架构·wpf
mudtools1 天前
C#中基于Word COM组件的数学公式排版实践
开发语言·c#·word