【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>

结语

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

相关推荐
CoderIsArt7 小时前
参数系统的基类Parameter抽象类
c#
盛夏绽放8 小时前
Python字符串常用方法详解
开发语言·python·c#
Tummer836312 小时前
C#+WPF+prism+materialdesign创建工具主界面框架
开发语言·c#·wpf
ghost14312 小时前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
yngsqq14 小时前
(for 循环) VS (LINQ) 性能比拼 ——c#
c#·solr·linq
想做后端的小C14 小时前
C# 面向对象 构造函数带参无参细节解析
开发语言·c#·面向对象
炯哈哈14 小时前
【上位机——WPF】App.xml和Application类简介
xml·开发语言·c#·wpf·上位机
bestcxx14 小时前
c# UTC 时间赋值注意事项
c#·utc
酷炫码神14 小时前
C#运算符
开发语言·c#
CoderIsArt15 小时前
WPF的UI元素类型详解
ui·wpf