WPF中的多重绑定

news2024/12/23 3:11:22

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

        <DataGrid
            Margin="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>
                            <Button
                                Width="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:

<UserControl
    x: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>
        <DataGrid
            Margin="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>
                            <Button
                                Width="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();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1084812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

求二叉树叶子节点的个数——递归

节点时NULL——》返回0 节点是叶子——》返回1 节点不是空也不是叶子&#xff1a;递归 代码&#xff1a; int BinaryTreeLeafSize(BTNode* root) {if (root NULL){return 0;}if (root->left NULL && root->right NULL){return 1;} return BinaryTreeLeafSiz…

如何有效改进erp管理系统?erp管理系统改进建议方向

前言&#xff1a; 说到erp&#xff0c;全称是企业资源计划&#xff0c;这可是企业管理的大杀器&#xff0c;也是现在企业管理的必备神器。它的出身可以追溯到上世纪90年代&#xff0c;那时候的企业管理可是个大难题&#xff0c;各种资源调配不灵光&#xff0c;企业主们急需一种…

快速构建代理应对

今天我要和大家分享一个解决反爬策略升级问题的方法&#xff0c;那就是快速构建代理池。如果您是一位爬虫开发人员&#xff0c;一定深知反爬策略的烦恼。但是&#xff0c;通过构建代理池&#xff0c;您可以轻松地应对反爬策略的升级&#xff0c;让您的爬虫持续高效运行。接下来…

vite vite.config.js中的配置

vite打包依赖于 rollup和esbuild rollup中文文档 esbulid中文文档 基本配置 import { defineConfig, loadEnv } from "vite"; import vue from "vitejs/plugin-vue"; import path from "path";import Components from "unplugin-vue-com…

pycharm的debug,你知道每个按钮对应哪个功能吗?

本文讲解pycharm的debug 1. debug的汇总图2. 第一个图标&#xff08;Step Over&#xff09;3. 第二个图标&#xff08;Step into&#xff09;4. 第三个图标&#xff08;Step Into My Code&#xff09;5. 第四个图标&#xff08;Step Out&#xff09;6. 第五个图标&#xff08;R…

02 stm32-hal库 timer 基本定时器设定

1.配置始终时钟参数 >2. 初始化 MX_TIM3_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim3);> 3.增加回调函数 4 中断服务函数 void TIM3_IRQHandler(void) {/* USER CODE BEGIN TIM3_IRQn 0 *//* USER CODE END TIM3_IRQn 0 */HAL_TIM_IRQHandler(&…

KITTI数据集中的二进制激光雷达数据(.bin文件)转换为点云数据(.pcd文件)(C++代码)

目录 main.cpp CMakeLists.txt main.cpp #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <fstream> #include <iostream> #include <vector>int main() {// Define file pathsstd::string input_filename "/home/f…

基于IDEA集成环境---Nacos安装

Nacos服务器是独立安装部署的&#xff0c;因此我们需要下载最新的Nacos服务端程序&#xff0c;下载地址&#xff1a;https://github.com/alibaba/nacos。 将文件进行解压&#xff0c;得到以下内容&#xff1a; 直接将其拖入到项目文件夹下&#xff0c;便于我们一会在IDEA内部…

Prometheus监控系统

Prometheus监控系统 一、Prometheus 概述&#xff1a;1.概述2.scrape3.Prometheus的架构4.TSDB 作为 Prometheus 的存储引擎完美契合了监控数据的应用场景5.Prometheus 的特点&#xff1a;6.Prometheus 的生态组件7.Prometheus 的工作模式8.Prometheus 的工作流程9.Prometheus …

当想为SLB申请公网域名时,缩写是什么意思

SLB的缩写是Server Load Balancer&#xff0c;即服务器负载均衡器。 是一种内网吗? 不&#xff0c;SLB&#xff08;Server Load Balancer&#xff09;是一种位于应用程序和网络之间的设备或服务&#xff0c;用于在多个服务器之间分发流量、负载均衡以及提供高可用性。它通常…

【vue3+ts】项目初始化

1、winr呼出cmd&#xff0c;输入构建命令 //用vite构建 npm init vitelatest//用cli脚手架构建 npm init vurlatest2、设置vscode插件 搜索volar&#xff0c;安装前面两个 如果安装了vue2的插件vetur&#xff0c;要禁用掉&#xff0c;否则插件会冲突

【C#】什么是并发,C#常规解决高并发的基本方法

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 在实际项目开发中&#xff0c;多少都会遇到高并发的情况&#xff0c;有可能是网络问题&#xff0c;连续点击鼠标无反应快速发起了N多次调用接口&#xff0c; 导致极短时间内重复调用了多次…

ar实景火灾模拟体验加强了学员对火灾险情的防范

在用火用电频繁的当下&#xff0c;消防安全知识和防范意识的培训显得尤为重要&#xff0c;为了帮助人们时刻牢记灭火技巧和灾害防范&#xff0c;AR开发公司基于AR大屏端开发的智慧消防AR模拟体验系统&#xff0c;为前来参观学习的客户提供一种身临其境的体验。 首先&#xff0c…

VR全景营销颠覆传统营销,让消费者身临其境

随着VR的普及&#xff0c;各种VR产品、功能开始层出不穷&#xff0c;并且在多个领域都有落地应用&#xff0c;例如文旅、景区、酒店、餐饮、工厂、地产、汽车等&#xff0c;在这个“内容为王”的时代&#xff0c;VR全景展示也是一种新的内容表达方式。 VR全景营销让消费者沉浸式…

SOFAJRaft 注册中心-心跳检测实现

文章目录 1.前言2.心跳流程图整体流程心跳续约&心跳检测 3.实现步骤3.1 客户端3.2 服务端3.2.1 HeartBeatRpcProcessor3.2.2 HeartBeatRequestHandler3.2.3 ServiceDiscoveryRequestHandlerFactory 新增 onBeat 方法3.2.4 ServiceDiscoveryCheckBeatThread 心跳检测线程3.2…

开发一个npm组件包(2)

通过vueelement 原来后台 开发npm包的时候 会遇到一下几个问题 入口文件变化为package/index 需要再配置打包方法 package.json下 "scripts": {"package": "vue-cli-service build --target lib ./src/package/index.js --name managerpage --dest…

scsi READ CAPACITY (10)命令总结

READ CAPACITY (10)概述&#xff1a; READ CAPACITY(10)命令(参见表119)请求设备服务器将描述直接访问块设备的容量和介质格式的8字节参数数据传输到数据缓存中。这个命令可以被处理&#xff0c;就好像它有一个HEAD OF QUEUE任务属性。 如果逻辑单元支持保护信息&#xff0c;应…

Java使用opencv实现人脸识别、人脸比对

1. opencv概述 OpenCV是一个开源的计算机视觉库&#xff0c;它提供了一系列丰富的图像处理和计算机视觉算法&#xff0c;包括图像读取、显示、滤波、特征检测、目标跟踪等功能。 opencv官网&#xff1a;https://opencv.org/ 2. 安装opencv 2.1 下载opencv opencv下载&#x…

idea中父工程Project创建

1.file-->new-->Project 2.选择maven包和JavaSDK 3.填写项目名&#xff0c;选择文件目录&#xff0c;项目包等 4.配置maven tip&#xff1a;约定>配置>编码 5.设置项目编码 6.注解生效激活&#xff0c;便于项目中使用注解 7.Java编译版本选择8 8.File Type 过滤&a…

Java idea查看自定义注解的调用地方

Java idea查看自定义注解的调用地方