《深入浅出WPF》读书笔记.6binding系统(下)

news2024/11/24 19:52:37

《深入浅出WPF》读书笔记.6binding系统(下)

背景

主要讲数据校验和数据转换以及multibinding

代码

binding的数据校验

<Window x:Class="BindingSysDemo.ValidationRulesDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingSysDemo"
        mc:Ignorable="d"
        Title="ValidationRulesDemo" Height="200" Width="400">
    <StackPanel VerticalAlignment="Center">
        <TextBox x:Name="tb1" Margin="5"></TextBox>
        <Slider x:Name="sld1" Minimum="-10" Maximum="110" Margin="5"></Slider>
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace BindingSysDemo
{
    /// <summary>
    /// ValidationRulesDemo.xaml 的交互逻辑
    /// </summary>
    public partial class ValidationRulesDemo : Window
    {
        public ValidationRulesDemo()
        {
            InitializeComponent();

            Binding binding = new Binding("Value") { Source = this.sld1, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged };
            RangeValidationRule rule = new RangeValidationRule();
            //此参数用来校验source数据
            rule.ValidatesOnTargetUpdated = true;
            binding.ValidationRules.Add(rule);
            //通过路由事件获取校验的报错信息
            //信号在UI树上传递的过程乘坐路由事件
            binding.NotifyOnValidationError = true;

            this.tb1.SetBinding(TextBox.TextProperty, binding);
            //监听校验失败错误
            this.tb1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(this.ValidationError));
        }

        private void ValidationError(object sender, RoutedEventArgs e)
        {
            if (Validation.GetErrors(this.tb1).Count > 0)
            {
                this.tb1.ToolTip = Validation.GetErrors(this.tb1)[0].ErrorContent.ToString();
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace BindingSysDemo
{
    public class RangeValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            //throw new NotImplementedException();
            double d = 0;
            if (double.TryParse(value.ToString(), out d))
            {
                if (d >= 0 && d <= 100)
                {
                    return new ValidationResult(true, null);
                }
            }
            return new ValidationResult(false, "Validation failed!");
        }
    }
}

binding的数据转换

<Window x:Class="BindingSysDemo.BindingConverterDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingSysDemo"
        mc:Ignorable="d"
        Title="BindingConverterDemo" Height="500" Width="600">
    <Window.Resources>
        <local:Category2SourceConverter x:Key="c2s"></local:Category2SourceConverter>
        <local:State2NullableBoolConverter x:Key="s2b"></local:State2NullableBoolConverter>
    </Window.Resources>
    <StackPanel Background="AliceBlue">
        <ListBox x:Name="listBoxPlane" Height="300" Margin="5">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Width="40" Height="20" Source="{Binding Path=Category, Converter={StaticResource c2s}}"></Image>
                        <TextBlock Text="{Binding Path=Name}" Width="60" Margin="80,0"></TextBlock>
                        <CheckBox IsThreeState="True" IsChecked="{Binding Path=State, Converter={StaticResource s2b}}"></CheckBox>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button x:Name="btnLoad" Content="Load" Height="25" Margin="5" Click="btnLoad_Click"></Button>
        <Button x:Name="btnSave" Content="Save" Height="25" Margin="5" Click="btnSave_Click"></Button>
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace BindingSysDemo
{
    /// <summary>
    /// BindingConverterDemo.xaml 的交互逻辑
    /// </summary>
    public partial class BindingConverterDemo : Window
    {
        public BindingConverterDemo()
        {
            InitializeComponent();
        }

        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            List<Plane> planes = new List<Plane>()
            {
                new Plane(){Category=Category.Bomber,Name="B-1",State=State.Unknown},
                new Plane(){Category=Category.Bomber,Name="B-2",State=State.Unknown},
                new Plane(){Category=Category.Fighter,Name="F-22",State=State.Unknown},
                new Plane(){Category=Category.Fighter,Name="Su-47",State=State.Unknown},
                new Plane(){Category=Category.Bomber,Name="B-52",State=State.Unknown},
                new Plane(){Category=Category.Fighter,Name="J-10",State=State.Unknown}
            };
            this.listBoxPlane.ItemsSource = planes;
        }

        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            foreach (Plane p in listBoxPlane.Items)
            {
                sb.AppendLine(string.Format("Category ={0},Name={1},State={2}", p.Category, p.Name, p.State));
            }
            File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + "PlaneList.txt", sb.ToString());
            MessageBox.Show("保存成功!");
        }
    }

    public enum Category
    {
        Bomber,
        Fighter
    }

    public enum State
    {
        Available,
        Locked,
        Unknown
    }

    public class Plane
    {
        public Category Category { get; set; }
        public State State { get; set; }
        public string Name { get; set; }
    }

}
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;

namespace BindingSysDemo
{
    public class Category2SourceConverter : IValueConverter
    {
        //将Category转换成Uri
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Category category = (Category)value;
            switch (category)
            {
                case Category.Fighter:
                    return @"\Icon\Fighter.png";
                case Category.Bomber:
                    return @"\Icon\Bomber.png";
                default:
                    return null;
            }
        }

        //不会被调用
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    public class State2NullableBoolConverter : IValueConverter
    {
        //将State转换成bool
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {

            State state = (State)value;
            switch (state)
            {
                case State.Locked:
                    return false;
                case State.Available:
                    return true;
                case State.Unknown:
                default:
                    return null;
            }
        }

        //不会被调用
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            bool? nb = (bool?)value;
            switch (nb)
            {
                case true:
                    return State.Available;
                case false:
                    return State.Locked;
                case null:
                default:
                    return State.Unknown;
            }
        }
    }
}

multibinding

当页面显示信息不仅由一个控件来决定,就可以使用multibinding。凡是使用binding的地方都可以使用multibinding

<Window x:Class="BindingSysDemo.MultiBindingDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingSysDemo"
        mc:Ignorable="d"
        Title="MultiBindingDemo" Height="400" Width="600">
    <StackPanel>
        <TextBox x:Name="tb1" Height="23" Margin="5"></TextBox>
        <TextBox x:Name="tb2" Height="23" Margin="5"></TextBox>
        <TextBox x:Name="tb3" Height="23" Margin="5"></TextBox>
        <TextBox x:Name="tb4" Height="23" Margin="5"></TextBox>
        <Button x:Name="btn1" Content="Submit" Width="80" Margin="5"></Button>
    </StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace BindingSysDemo
{
    /// <summary>
    /// MultiBindingDemo.xaml 的交互逻辑
    /// </summary>
    public partial class MultiBindingDemo : Window
    {
        public MultiBindingDemo()
        {
            InitializeComponent();
            this.SetMultiBinding();
        }

        private void SetMultiBinding()
        {
            //准备基础binding
            Binding b1 = new Binding("Text") { Source = this.tb1 };
            Binding b2 = new Binding("Text") { Source = this.tb2 };
            Binding b3 = new Binding("Text") { Source = this.tb3 };
            Binding b4 = new Binding("Text") { Source = this.tb4 };

            //multibinding
            MultiBinding mb = new MultiBinding();
            mb.Bindings.Add(b1);
            mb.Bindings.Add(b2);
            mb.Bindings.Add(b3);
            mb.Bindings.Add(b4);
            mb.Converter = new LoginMultiBindingConverter();

            this.btn1.SetBinding(Button.IsEnabledProperty, mb);
        }
    }

    public class LoginMultiBindingConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (!values.Cast<string>().Any(o => string.IsNullOrEmpty(o)) && values[0].ToString() == values[2].ToString()
                && values[1].ToString() == values[3].ToString())
            {

                return true;
            }
            return false;
        }

        public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

}

git代码

GitHub - wanghuayu-hub2021/WpfBookDemo: 深入浅出WPF的demo


这章完结了,顺手点个赞老铁。

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

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

相关文章

innodb_buffer_pool_size在线缩小操作

一、背景 测试数据库内存32G&#xff0c;只有MySQL数据库&#xff0c;但是innodb_buffer_pool_size设置了24G&#xff0c;导致经常出现lack of memory问题、lack of swap问题。 因为使用了MySQL5.7.36版本&#xff0c;利用innodb_buffer_pool_size参数值可在线调整的新特性&…

这个TOP 100 AI应用榜单,包含了所有你需要的使用场景(一)

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

【源码+文档+调试讲解】劳务外包管理系统的设计与实现

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对劳务外包信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

微分方程(Blanchard Differential Equations 4th)中文版Section3.7

迹-行列式平面上平面系统分析 在前面的章节中,我们遇到了许多不同类型的线性微分方程系统。到目前为止,可能会觉得这些系统有很多不同的可能性,每种都有其独特的特征。为了将这些例子放在整体视角下进行回顾,创建一个表格是一个有用的方法。 总结我们到目前为止所做的工作…

基于SHAP进行特征选择和贡献度计算——可解释性机器学习

方法介绍 SHAP&#xff08;SHapley Additive exPlanations&#xff09;是一个 Python 包&#xff0c;旨在解释任何机器学习模型的输出。SHAP 的名称源自合作博弈论中的 Shapley 值&#xff0c;它构建了一个加性的解释模型&#xff0c;将所有特征视为“贡献者”。对于每个预测样…

深入探讨量子计算领域的最新进展及其对社会经济的影响

一、引言 在21世纪的科技浪潮中&#xff0c;量子计算作为一项颠覆性技术&#xff0c;正逐步从理论走向实践&#xff0c;成为各国竞相争夺的科技制高点。量子计算利用量子力学原理&#xff0c;实现了对传统计算模式的根本性变革&#xff0c;其强大的并行处理能力和指数级增长的…

如何正确使用 Parallels Desktop 的快照功能

在 Parallels Desktop for Mac 中&#xff0c;快照&#xff08;Snapshot&#xff09;功能非常实用&#xff0c;特别是当你需要在不同的状态之间自由切换&#xff0c;或是想要在实验或测试前备份虚拟机状态时。以下是使用快照功能的详细步骤和注意事项&#xff1a; 注意 在 Ap…

基于x86_64系统构建并运行aarch64架构docker镜像

基于x86_64系统构建并运行aarch64架构docker镜像 1.安装qemu模拟器2.编写Dockerfile3.查看镜像架构4.启动容器 1.安装qemu模拟器 docker run --privileged --rm tonistiigi/binfmt --install all如果出现invalid argument等信息&#xff0c;表示qemu安装失败。可能是内核版本问…

python读取csv,中文输出乱码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于51单片机的百叶窗proteus仿真

地址&#xff1a;https://pan.baidu.com/s/19M6jeTIHJcyDBGNx4H9nTA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

从最浅层剖析C语言——第四节(超详细讲解一维数组内容)

目录 1. 数组的概念 2. 一维数组的创建及其初始化 2.1 数组的创建 2.2 数组的初始化 考点总结&#xff1a;当我们未对数组进行初始化时&#xff0c;数组里面的元素打印出来是乱码&#xff0c;但哪怕只对数组里面一个元素赋值&#xff0c;之后未被赋值的元素也会默认赋值为…

Dijkstra(c++)

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始&#xff0c;采用贪心算法的策略&#…

《晶核》服务器架构——第二篇

继上面的第一篇文章&#xff0c;没看的可以翻一下。还是进程数量多的问题&#xff1f; 副本问题怎么解决&#xff1f;服务器该如何设计&#xff1f; 按照他们这个做法是副本与场景都是地图&#xff0c;所以就造成了下面这样的问题。假如&#xff0c;我有1万人的在线数量&…

从源码开始:在线教育系统与网校APP的架构设计与开发实践

这篇文章将从源码层面探讨在线教育系统与网校APP的架构设计与开发实践&#xff0c;帮助开发者理解核心技术与实现路径&#xff0c;进而打造功能全面、性能优异的在线教育平台。 一、在线教育系统的核心功能模块 在设计在线教育系统时&#xff0c;首先需要明确其核心功能模块。…

PCL区域生长分割

文章目录 一、算法原理1、输入2、初始化3、算法二、代码部分三、代码解释参考文献本文,我们将学习如何使用 pcl::RegionGrowing 类中实现的区域生长算法。该算法的目的是合并在平滑度约束方面足够接近的点。因此,该算法的输出是簇的集合,其中每个簇被认为是同一光滑表面的一…

NASA:北极辐射-冰桥海冰实验(ARISE)2014年原地云数据产品

ARISE_Cloud_AircraftInSitu_C130_Data 简介 ARISE_Cloud_AircraftInSitu_C130_Data_1是北极辐射-冰桥海冰实验&#xff08;ARISE&#xff09;2014年原地云数据产品。该产品是位于华盛顿的美国宇航局科学任务局地球科学部辐射科学、冰冻层科学和机载科学计划共同努力的成果。…

Mysql高可用之组复制 (MGR)从原理到实战一篇解决

一&#xff1a;原理 简介&#xff1a; MySQL Group Replication(简称 MGR )是 MySQL 官方于 2016 年 12 月推出的一个全新的高可用与高扩展的解决方案。 组复制是 MySQL 5.7.17 版本出现的新特性&#xff0c;它提供了高可用、高扩展、高可靠的 MySQL 集群服务 MySQL 组复制分…

如何优雅处理异步组件加载:Vue 3 的 Suspense 特性

在日常开发中&#xff0c;我们可能会遇到网络不佳或内容加载时间较长的情况。如果当前页面没有任何内容提示&#xff0c;用户的体验非常糟糕&#xff0c;可能会反复刷新以便加载成功。因此&#xff0c;我们需要给用户提供一个加载中的效果&#xff0c;告知用户“我在努力加载中…

怎样快速搭建 Linux 虚拟机呢?(vagrant 篇)

作为一名Coder&#xff08;程序员或码农&#xff09;&#xff0c;供职于中小型互联网公司&#xff0c;而你恰恰偏向于服务端&#xff0c;那么&#xff0c;产品部署在生产环境的艰巨任务&#xff0c;便毫无疑问的落在你身上了。 只有大厂&#xff08;大型互联网&#xff09;企业…

程序员:全栈的痛你不知道

上周一个同事直接对我开喷&#xff0c;骂我无能&#xff0c;说&#xff1a;“你怎么一个人就搞不定所有系统呢&#xff1f;”&#xff0c;我半支烟纵横IT江湖14余年&#xff0c;还是第一次被人这么嫌弃。 事情缘由 某公司的业务线特别多&#xff0c;有个业务线前后端项目共计…