首页 > 其他分享 >[WPF]XAML中使用IMultiValueConverter实现Command的多参数传参

[WPF]XAML中使用IMultiValueConverter实现Command的多参数传参

时间:2024-09-14 17:05:03浏览次数:8  
标签:传参 args XAML object IMultiValueConverter values 参数 public

对ICommand进行多参数传参

问题

如何对ICommand传入多个参数?

背景

最近在做一个WPF的开发,有多个相近的功能写了不同的Command,因为要对应不同的对象。因为是CtrlCV,显得代码有点冗赘不够优雅,但是ICommand又只能接受一个参数。

思路

使用MultiBinding,对CommandParameter进行绑定,然后再使用IMultiValueConverter对多个参数进行转换,变成object传进去

代码实现

  1. 实现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();
    }
}
  1. 在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>
  1. 在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...
    }
}
  1. 亦可以使用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();
    }
}

标签:传参,args,XAML,object,IMultiValueConverter,values,参数,public
From: https://www.cnblogs.com/echo-sama/p/18414343

相关文章

  • Vue3中路由传参的几种方式实践
    【1】RouterLink+query父组件脚本如下:<scriptsetuplang="ts"name="News">import{reactive}from'vue'import{RouterView,RouterLink}from'vue-router'constnewsList=reactive([{id:'asfdtrfay01',......
  • urllib发送get请求_中文传参问题
    GET请求是HTTP协议中的一种基本方法,当需要在GET请求中传递中文参数时需要额外对中文进行编码(英文不需要),因为url中只能包含ascii字符。可以使用urllib.parser.urlencode()或urllib.parse.quote()方法对中文转码。详细查官方文档:https://docs.python.org/3.12/library/urllib.par......
  • UNO 已知问题 在后台线程触发 SKXamlCanvas 的 Invalidate 且在 PaintSurface 事件抛
    本文记录一个UNO已知问题,在UNO里面可以利用SKXamlCanvas对接Skia绘制到应用里面。如果此时在后台线程里面调用SKXamlCanvas的Invalidate触发界面的重新刷新,但在具体的执行绘制PaintSurface事件里面对外抛出异常,将会导致应用炸掉背景:我准备在UNO里面将Microsoft......
  • UNO WinUI 已知问题 在 XAML 条件构建里将 win 平台加入 Ignorable 将构建失败
    如果在UNO项目里面,为了进行XAML条件构建,将win平台加入到mc:Ignorable里面,将会在构建时提示XamlInternalErrorerrorWMC9999:Unexpected'NONE'inparserule'Element::=.EmptyElement(StartElementElementBody).'.错误如以下的代码,将会在构建时失败,提示X......
  • VisualStudio 通过配置 DefaultXamlRuntime 属性 让控制台项目里的 XAML 应用上智能提
    本文记录一个VisualStudio黑科技,通过配置DefaultXamlRuntime属性,即可让非WPF或WinUI或MAUI等系列类型的项目也可以拥有XAML的智能提示,智能提示方式和WinUI智能提示行为相同比如说在一个控制台项目里面,我期望从控制台开始,定制自己的UI框架,比如说到现在还没有支持......
  • Win11系统提示找不到ReactNativeXaml.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个ReactNativeXaml.dll文件(挑选合适的版本文......
  • vue路由传参接收以及传参对象为对象时的问题及解决--router
    场景:<div@click='toDetail'>查看详情</div>路由传参不能直接传一个对象,需要使用JSON.stringify()方法将其转换成一个字符串,然后在其他页面接受的时候再使用JSON.parse()方法转换成一个对象constrouter=useRouter()consttoDetail=()=>{   //我使用的是Vue3,rout......
  • 二维数组传参要点
    最近在写代码的时候又一次遇到了需要二维数组传参的操作,捣鼓了半天,总是会指针有问题,上网上查阅了相关资料后,虽然弄懂了,但是后面还是把二维改成一维了。但是呢?还是把相关的学习记录整理下来,以防后续还是需要用上。 这里主要以如何声明函数,如何调用函数,在函数中如何使用来讲解。形......
  • CI3自定义类库,并传参
    1、创建类文件 2、构造函数中使用数组形参,接收传递参数classHehe{//------------------------------------------------------------------------publicfunction__construct($config=array()){p($config);}//-------------------------------......
  • Vue路由传参
    有query传参和params传参query:通过路由传参进行拼接,如下:<router-link:to="{name:'login',query:{id:10110,username:'yansunda'}}">登录组件</router-link>采用编程式导航使用query,使用$router.pushthis.$router.push({......