当前位置: 首页 > news >正文

WPF中的多重绑定

MultiBinding 将会给后端传回一个数组, 其顺序为绑定的顺序. 例如:

        <DataGridMargin="10"AutoGenerateColumns="False"ItemsSource="{Binding Stu}"><DataGrid.Columns><DataGridTextColumn Binding="{Binding Id}" Header="Id" /><DataGridTextColumn Binding="{Binding Name}" Header="Name" /><DataGridTextColumn Binding="{Binding Age}" Header="Age" /><DataGridTextColumn Binding="{Binding Description}" Header="Description" /><DataGridTemplateColumn><DataGridTemplateColumn.CellTemplate><DataTemplate><ButtonWidth="60"HorizontalAlignment="Center"Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext.MyButtonCommand}"CommandParameter="{Binding}"Content="申请"><Button.Style><Style TargetType="Button"><!--<Setter Property="IsEnabled" Value="{Binding Age, Converter={StaticResource SingleParamConverter}}" />--><Setter Property="IsEnabled"><Setter.Value><MultiBinding Converter="{StaticResource MultiParamConverter}"><Binding Path="Age"/><Binding Path="Id"/></MultiBinding></Setter.Value></Setter></Style></Button.Style></Button></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid>

在这里的 Button 的isEnabled属性用了多重绑定给converter, 用来筛选条件

                                        <Setter Property="IsEnabled"><Setter.Value><MultiBinding Converter="{StaticResource MultiParamConverter}"><Binding Path="Age"/><Binding Path="Id"/></MultiBinding></Setter.Value></Setter>

这时 后端转换器为:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;namespace NavTest.Components
{public class MultiParamConverter : IMultiValueConverter{public object Convert(object[] values,Type targetType,object parameter,CultureInfo culture){int age;int id;if (values == null){return true;}int.TryParse(values[0].ToString(), out age);int.TryParse(values[1].ToString(), out id);if (age > 1 && id > 5){return true;}return false;}public object[] ConvertBack(object value,Type[] targetTypes,object parameter,CultureInfo culture){throw new NotImplementedException();}}
}

效果:

在这里插入图片描述
完整代码:

view:

<UserControlx:Class="NavTest.Views.Page5"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:cv="clr-namespace:NavTest.Components"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:hc="https://handyorg.github.io/handycontrol"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:local="clr-namespace:NavTest.Views"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:mv="clr-namespace:NavTest.ViewModels"d:DataContext="{d:DesignInstance mv:Page5ViewModel}"d:DesignHeight="450"d:DesignWidth="800"mc:Ignorable="d"><UserControl.Resources><cv:SingleParamConverter x:Key="SingleParamConverter" /><cv:MultiParamConverter x:Key="MultiParamConverter" /></UserControl.Resources><Grid><Grid.ColumnDefinitions><ColumnDefinition /><ColumnDefinition /></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition /><RowDefinition /></Grid.RowDefinitions><DataGridMargin="10"AutoGenerateColumns="False"ItemsSource="{Binding Stu}"><DataGrid.Columns><DataGridTextColumn Binding="{Binding Id}" Header="Id" /><DataGridTextColumn Binding="{Binding Name}" Header="Name" /><DataGridTextColumn Binding="{Binding Age}" Header="Age" /><DataGridTextColumn Binding="{Binding Description}" Header="Description" /><DataGridTemplateColumn><DataGridTemplateColumn.CellTemplate><DataTemplate><ButtonWidth="60"HorizontalAlignment="Center"Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext.MyButtonCommand}"CommandParameter="{Binding}"Content="申请"><Button.Style><Style TargetType="Button"><!--<Setter Property="IsEnabled" Value="{Binding Age, Converter={StaticResource SingleParamConverter}}" />--><Setter Property="IsEnabled"><Setter.Value><MultiBinding Converter="{StaticResource MultiParamConverter}"><Binding Path="Age"/><Binding Path="Id"/></MultiBinding></Setter.Value></Setter></Style></Button.Style></Button></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid></Grid>
</UserControl>

viewModel:

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NavTest.Eneities;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;namespace NavTest.ViewModels
{public partial class Page5ViewModel:ObservableObject{public Page5ViewModel(){for (int i = 0; i < 10; i++){Stu.Add(new(){Id = i + 2,Age = $"{i}",Name = $"Name{i}",Description = $"Description{i}"});}}[ObservableProperty]private ObservableCollection<Student> stu = new();[RelayCommand]public void MyButton(Student s){MessageBox.Show(s.Name);}}
}

转换器:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;namespace NavTest.Components
{public class MultiParamConverter : IMultiValueConverter{public object Convert(object[] values,Type targetType,object parameter,CultureInfo culture){int age;int id;if (values == null){return true;}int.TryParse(values[0].ToString(), out age);int.TryParse(values[1].ToString(), out id);if (age > 1 && id > 5){return true;}return false;}public object[] ConvertBack(object value,Type[] targetTypes,object parameter,CultureInfo culture){throw new NotImplementedException();}}
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;namespace NavTest.Components
{public class SingleParamConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value == null){return true;}int age;int.TryParse(value.ToString(), out age);if (age > 5){return true;}return false;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){throw new NotImplementedException();}}
}

相关文章:

WPF中的多重绑定

MultiBinding 将会给后端传回一个数组, 其顺序为绑定的顺序. 例如: <DataGridMargin"10"AutoGenerateColumns"False"ItemsSource"{Binding Stu}"><DataGrid.Columns><DataGridTextColumn Binding"{Binding Id}" Header…...

区块链在游戏行业的应用

区块链技术在游戏行业有许多潜在的应用&#xff0c;它可以改变游戏开发、发行和玩家交互的方式。以下是区块链技术在游戏行业的一些主要应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.游戏资产…...

uniapp快速入门系列(4)- 微信小程序开发

第四章 微信小程序开发 4.1 微信小程序开发与uniapp的融合4.2 微信小程序API在uniapp中的使用4.3 微信小程序常见问题的解决方法问题1: 如何获取用户信息&#xff1f;问题2: 如何获取当前位置&#xff1f;问题3: 如何发送网络请求&#xff1f; 在本章中&#xff0c;我们将学习如…...

Kafka保证消息幂等以及解决方案

1、幂等的基本概念 幂等简单点讲&#xff0c;就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的&#xff0c;不会产生任何副作用。幂等分很多种&#xff0c;比如接口的幂等、消息的幂等&#xff0c;它是分布式系统设计时必须要考虑的一个方面。 查询操作(天然幂等…...

接口测试用例设计

接口测试...

wireshark抓rtp包,提取出H265裸流数

调试rtsp收发流时&#xff0c;经常会需要抓包以确认是网络问题还是程序问题还是其它问题。通过tcpdump或者wireshark抓到的包通常是rtp流&#xff0c;保存为.pcap格式文件后中&#xff0c;可通过wireshark进行解析&#xff0c;得出h264裸流&#xff0c;并保存为文件。 1.wires…...

Excel往Word复制表格时删除空格

1.背景 在编写文档&#xff0c;经常需要从Excel往Word里复制表格 但是复制过去的表格前面会出现空格&#xff08;缩进&#xff09; 再WPS中试了很多方法&#xff0c;终于摆脱了挨个删除的困扰 2. WPS排版中删除 选择表格菜单栏-选在【开始】-【排版】选择【更多段落处理】-【段…...

客户机操作系统已禁用 CPU。请关闭或重置虚拟机(解决)

解决&#xff1a; 关闭虚拟机进入设置点击处理器给虚拟化引擎两个勾上确认后重新即可...

UnityShaderLab —— 简单的流光shader

原理&#xff1a; 就是在原先的模型表面叠加一层可以流动的图片&#xff0c; 算法代码&#xff1a; float2 tex; tex float2(i.uv.x - _Time.x * _Speed,i.uv.y); fixed4 col0 tex2D(_Tex, tex)* _Strenth; fixed4 col1 tex2D(_MainTex, i.uv); return col0 col1; 这里…...

代理IP在保护跨境商家网络安全中的重要作用

在当前全球化的背景下&#xff0c;跨境电商成为一种重要的商业模式&#xff0c;越来越多的商家涌入国际市场&#xff0c;商家们通过互联网平台将商品远销国外&#xff0c;但网络安全风险随之而来。跨境商家因为需要处理大量的在线交易和产品数据&#xff0c;如果未能对这些敏感…...

2核4G服务器支持多少用户同时在线访问?卡不卡?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;从CPU内存的角度&#xff0c;网站程序效…...

[Error]在Swift项目Build Settings的Preprocessor Macros中定义的宏无效的问题

问题 如图&#xff0c;在Build Settings -> Preprocessor Macros中添加了ISADEMO1。但在代码中判断无效&#xff0c;还是会输出“isn’t ADemo” #if ISADEMOprint("is ADemo") #elseprint("isnt ADemo") #endif解决 如图&#xff0c;要让Preproces…...

网格管理安全巡检系统—助企业全面安全检查

通过应用安全巡检管理系统&#xff0c;企业能更好地管理控制安全风险&#xff0c;保障员工生命安全和财产安全&#xff0c;避免出现各种危险隐患&#xff0c;帮助企业快速提高生产发展实力。 一、凡尔码搭建安全巡检系统的功能 1.巡检计划:帮助用户制定巡检计划&#xff0c;包括…...

【Java】replace替换方法

String 替换方法 replace() 方法用于将目标字符串中的指定字符&#xff08;串&#xff09;替换成新的字符&#xff08;串&#xff09;replaceFirst() 方法用于将目标字符串中匹配某正则表达式的第一个子字符串替换成新的字符串replaceAll() 方法用于将目标字符串中匹配某正则表…...

CentOS yum update

详情内容 CentOS yum update升级命令详解&#xff0c;包括yum check-update&#xff0c;yum update&#xff0c;yum install等升级安装命令详细使用方法。 1.列出所有可更新的软件清单 命令&#xff1a; yum check-update 2.安装所有更新软件 命令&#xff1a; yum updat…...

/etc/profile与~/.bash_profile的区别

/etc/profile和~/.bash_profile都是用于存储用户的配置文件的&#xff0c;但它们的作用范围和加载顺序有所不同。 /etc/profile是系统级的配置文件&#xff0c;它应用于所有用户。当用户登录时&#xff0c;系统会首先加载/etc/profile。这个文件存储了系统范围的环境变量、系统…...

vue+element实现电商商城礼品代发网,商品、订单管理

一、项目效果图 1.首页 2.登录 版本2&#xff1a; 3.注册 4.找回密码 5.立即下单 6.商品详情 7.个人中心-工作台 8.个人中心-订单列表 9.订单中心-包裹列表 10.个人中心-工单管理 11.我的钱包 12.实名认证 13.升级vip 14.个人中心-推广赚钱 二、关键源码 1.路由配置 impor…...

Python接口自动化-requests模块之post请求

一、源码解析 def post(url, dataNone, jsonNone, **kwargs):r"""Sends a POST request.:param url: URL for the new :class:Request object.:param data: (optional) Dictionary, list of tuples, bytes, or file-likeobject to send in the body of the :cl…...

DDoS检测防御实现方案

流量采集模式 通过分光器将流量直接镜像到攻击检测器&#xff0c;收包采用DPDK库。 当前整机流量、源IP信息、连接数 、连接内容(五元组等)的信息汇聚 当发生告警时采样原始数据包&#xff0c; 采用固定采样算法 基于检测对象的TCP syn ack psh ack established的个数、流量…...

ArcGIS: 第二届全国大学生GIS技能大赛(广西师范学院)详解-下午题

目录 01 题目 02 思路和实操 2.1 流域提取-思路 2.2 流域提取-实操 2.2.1 获取DEM ​编辑 2.2.2 水文分析-提取流域基于单出水口 2.3 河网分级-思路 2.4 河网分级-实操 2.4.1 提取河道网络 2.4.2 河网分级 ​编辑 2.5 子流域提取和处理-思路 2.6 子流域提取和处理-实…...

终极指南:buger/jsonparser如何10倍加速处理第三方API不确定性数据

终极指南&#xff1a;buger/jsonparser如何10倍加速处理第三方API不确定性数据 【免费下载链接】jsonparser One of the fastest alternative JSON parser for Go that does not require schema 项目地址: https://gitcode.com/gh_mirrors/js/jsonparser 在处理第三方AP…...

Vivado平台下PCIe IP核选型指南:从硬核到XDMA的实战抉择

1. PCIe技术基础与Vivado开发环境搭建 第一次接触PCIe接口开发时&#xff0c;我被各种专业术语搞得晕头转向。后来才发现&#xff0c;理解PCIe就像理解高速公路系统一样简单。PCIe本质上是一种点对点的高速串行总线&#xff0c;就像城市间修建的多车道高速公路。每个"车道…...

忍者绘卷Z-Image Turbo新手避坑:3个技巧搞定负向提示词

忍者绘卷Z-Image Turbo新手避坑&#xff1a;3个技巧搞定负向提示词 1. 负向提示词在忍者绘卷中的特殊价值 在忍者绘卷Z-Image Turbo这个专为二次元/火影忍者风格优化的AI绘画工具中&#xff0c;负向提示词扮演着"封印术"般的角色。它不仅仅是简单的排除列表&#x…...

Windows更新修复新范式:Reset-Windows-Update-Tool的系统化解决方案

Windows更新修复新范式&#xff1a;Reset-Windows-Update-Tool的系统化解决方案 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool …...

从零玩转GitHub:避坑指南与进阶技巧——2026年还不懂的天塌了

好的&#xff0c;今天这篇&#xff0c;咱不聊风花雪月&#xff0c;不扯行业趋势&#xff0c;就唠一个程序员安身立命的硬通货——GitHub。 对&#xff0c;就是那个绿油油的头像、一片Contributions的小方格&#xff0c;被无数简历写成“熟悉版本控制工具”&#xff0c;但可能连…...

ARMv8汇编指令实战解析:adrp、adr与adr_l在Linux内核启动中的应用

1. ARMv8寻址指令家族概览 在ARMv8架构中&#xff0c;adrp、adr和adr_l这三个指令堪称地址计算的"三剑客"。它们虽然名字相似&#xff0c;但各自有着独特的设计哲学和应用场景。就像搬家时选择不同的交通工具——adr是短途搬运的小推车&#xff0c;adrp是能承载重物的…...

SmallThinker-3B-Preview部署教程:边缘设备一键运行的保姆级指南

SmallThinker-3B-Preview部署教程&#xff1a;边缘设备一键运行的保姆级指南 想试试在树莓派或者你的旧笔记本上跑一个自己的AI助手吗&#xff1f;今天要聊的SmallThinker-3B-Preview&#xff0c;可能就是你的菜。它是个小个子&#xff0c;但本事不小&#xff0c;专门为那些内…...

ROS 实战指南:从 rosbag 高效提取 RGB 与深度图数据

1. rosbag基础操作与核心概念 在机器人开发领域&#xff0c;rosbag就像是一个万能的数据记录仪。想象一下你正在调试一个机器人视觉系统&#xff0c;传感器数据像流水一样不断涌来&#xff0c;这时候rosbag就能帮你把关键数据"冻住"&#xff0c;方便后续反复分析。我…...

本地硬盘装系统神器更新!WinToHDD v7.0,支持加密/多分区安装

软件下载 夸克下载&#xff1a;https://pan.quark.cn/s/8bb2d79a1f4c迅雷下载&#xff1a;https://pan.xunlei.com/s/VOottCVsfGa3nDKv07YreMVPA1?pwdve85#UC下载&#xff1a;https://pan.xunlei.com/s/VOottCVsfGa3nDKv07YreMVPA1?pwdve85# 软件介绍 前几天一直看见有群友…...

Zigbee网关配网操作全解析:从连接到触发

1. Zigbee网关配网前的准备工作 第一次接触Zigbee网关配网的朋友可能会觉得有点复杂&#xff0c;但其实只要跟着步骤一步步来&#xff0c;整个过程并不难。我刚开始接触时也踩过不少坑&#xff0c;现在把这些经验都整理出来&#xff0c;希望能帮你少走弯路。 首先得确认你的硬件…...