[WPF]XAML中使用IMultiValueConverter实现Command的多参数传参
问题
如何对ICommand传入多个参数?
背景
最近在做一个WPF的开发,有多个相近的功能写了不同的Command,因为要对应不同的对象。因为是CtrlCV,显得代码有点冗赘不够优雅,但是ICommand又只能接受一个参数。
思路
使用MultiBinding,对CommandParameter进行绑定,然后再使用IMultiValueConverter对多个参数进行转换,变成object传进去
代码实现
- 实现IMultiValueConverter
public class MultiValueConverter:IMultiValueConverter{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
object[] args = new object[values.Length];
values.CopyTo(args, 0);
//要重新创建values的实例,否则参数传过去是空引用
return args;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
- 在XAML里实现绑定
<Page.Resource>
<cvt:MultiValueConverter x:Key="commandParameterConverter">
</Page.Resource>
...
<Button
Command="{Binding StartCommand}"
Content="Start">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource commandParameterConverter}">
<Binding Path="DataContext.Path1" RelativeSource="{RelativeSource AncestorType=local:HomePage}" />
</MultiBinding>
</Button.CommandParameter>
</Button>
- 在ViewModel中的处理逻辑
public class HomePageViewModel:ObservableObject{
public string Path1 {get;set;}
[RelayCommand]
private async Task Start(object arg){
if(object is not object[] args || args[0] is not string path){
throw new Exception("Invalid argument type");
}
//Do Something else...
}
}
- 亦可以使用Tuple进行传参
仅展示TupleConverter啦,其余大体差不多
public class TupleConverter:IMultiValueConverter{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return Tuple.Create(values[0],values[1],values[2]);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
[WPF]XAML中使用IMultiValueConverter实现Command的多参数传参的更多相关文章
- WPF xaml中列表依赖属性的定义
列表内容属性 如上图,是一个列表标题排序控件,我们需要定义一个标题列表,从而让调用方可以自由的设置标题信息. 在自定义控件时,会遇到列表依赖属性,那么该如何定义呢? 下面是错误的定义方式: /// & ...
- WPF Xaml中创建集合
首先在xaml中创建集合是一个不可取的方法. 本方法仅作为xaml的学习. 本文略微无聊,主要是编写的东西都是老玩意. 首先是定义一个类,作为你要加载集合的模型. 结构如下 internal clas ...
- 关于WPF XAML 中 Trigger的反向ExitActions
触发器,顾名思义,就是当满足一定条件时,会触发一些操作,比如:改变控件的透明度,显隐,宽高等等,触发器本身做了一些操作,就是触发器触发条件不符合的时候,会自动把在触发器中更改的属性还原.但,并不是所有 ...
- WPF XAML中 Storyboard.TargetProperty设置TransformGroup指定的变换"RenderTransform.Children
<Grid x:Name="xx" RenderTransformOrigin="0.5,0.5"> <Grid.RenderTransfor ...
- Hibernate的HQL语句中定位参数和具名参数传参
HQL查询: 1.有关hql查询语句中的问号参数形式,如果出现有多个问号,这对后面设置参数就比较麻烦. 如:from User user where user.name=? and user.age= ...
- C++中的二级指针和指针引用函数传参
在函数的使用过程中,我们都明白传值和传引用会使实参的值发生改变.那么能够通过传指针改变指针所指向的地址吗? 在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&am ...
- 标记扩展和 WPF XAML
本主题介绍 XAML 的标记扩展概念,包括其语法规则.用途以及底层的类对象模型. 标记扩展是 XAML 语言以及 XAML 服务的 .NET 实现的常规功能. 本主题专门详细论述了用于 WPF X ...
- WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参
原文:WPF ContextMenu 在MVVM模式中绑定 Command及使用CommandParameter传参 ContextMenu无论定义在.cs或.xaml文件中,都不继承父级的DataC ...
- 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发
原文 http://blog.csdn.net/flexmapserver/article/details/5868882 用Windows Form进行ArcGIS Engine二次开发时常见的形式 ...
- VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。
原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...
随机推荐
- 轻松玩转 JMeter 测试计划组件
轻松玩转 JMeter 测试计划组件 宝子们,今天咱就来唠唠 JMeter 里那个超重要的测试计划组件,它可是整个性能测试的 "指挥官",把各种测试元素安排得明明白白. 一.测试计 ...
- vs code 添加jquery的智能提示
1.安装node.js 2.新建VsCodeTestApp文件夹,用vs code打开这个文件夹 3.打开cmd,进入TestApp文件夹所在盘符,然后cd进入VsCodeTestApp C:\Use ...
- 【BUG排查记】HttpUtil和SpringSecurity结合的坑
一.背景 最近为了做微服务高可用和优化上线流程,我参与了一个微服务的改造开发. 主要包括redis切换哨兵模式.接入高可用xxljob集群.配置和升级脚本优化. 二.问题描述 项目改造提测后,测试 ...
- Sharding-JDBC分库分表
https://blog.csdn.net/bochuangli/article/details/123029392 https://blog.csdn.net/bochuangli/article/ ...
- 九集代码深度解析SpringBoot原理:笔记整理
手动注册Tomcat中的servlet容器 子父容器概念
- dart子类的继承
1 Dart中类的继承 1.子类使用extends关键字来继承父类 2.子类会继承父类里面可见的属性和方法,但是不会继承构造函数 3. 子类能够复写父类的方法 getter和setter方法 2Dar ...
- Oracle用户的创建和授权
1 --创建用户.密码 2 create user infouser identified by "User@2022!"; 3 --授权连接数据库权限 4 grant conne ...
- 爬虫无限Debugger解决方案
爬虫无限Debugger解决方案 在应对网站中的debugger语句以防止爬虫被调试时,一些网站会在代码中插入这些断点以干扰调试行为. 一种极端但直接的方法是通过禁用浏览器的断点激活功能来绕过所有de ...
- Flink11--FliterAndKeyBy算子
一.导入依赖 参考本人下博客 二.代码 FLink11FilterApp.java package net.xdclass.class9; import org.apache.flink.api.co ...
- Hive表误删恢复
一.简介 因hive表删除后,hdfs文件会先放入回收站,定期清理回收站.在回收之前可以进行清理数据 二.恢复步骤 2.1 看表存储是否损坏select type from dw.ods_test1 ...