【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>
结语
以上是个人日常学习中学到的一下知识,和理解。