WPF/C#:数据绑定到方法

在WPF Samples中有一个关于数据绑定到方法的Demo,该Demo结构如下:

image-20240621101313200

运行效果如下所示:

来看看是如何实现的。

先来看下MainWindow.xaml中的内容:

<Window.Resources>
    <ObjectDataProvider ObjectType="{x:Type local:TemperatureScale}"
                        MethodName="ConvertTemp" x:Key="ConvertTemp">
        <ObjectDataProvider.MethodParameters>
            <system:Double>0</system:Double>
            <local:TempType>Celsius</local:TempType>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

    <local:DoubleToString x:Key="DoubleToString" />

</Window.Resources>

在窗体资源中定义了一个ObjectDataProvider对象与DoubleToString对象。

ObjectDataProvider介绍

image-20240621102324090

ObjectDataProvider类用于包装和创建可以用作绑定源的对象。

 <ObjectDataProvider MethodName="ConvertTemp" >

image-20240621102953193

ObjectDataProvider.MethodName 属性获取或设置要调用的方法的名称。

<ObjectDataProvider.MethodParameters>
    <system:Double>0</system:Double>
    <local:TempType>Celsius</local:TempType>
</ObjectDataProvider.MethodParameters>

image-20240621103147579

ObjectDataProvider.MethodParameters属性获取要传递给方法的参数列表。

绑定到方法

<TextBox Grid.Row="1" Grid.Column="1" Name="tb">
    <TextBox.Text>
        <Binding Source="{StaticResource ConvertTemp}" Path="MethodParameters[0]"
       BindsDirectlyToSource="true" UpdateSourceTrigger="PropertyChanged"
       Converter="{StaticResource DoubleToString}">
            <Binding.ValidationRules>
                <local:InvalidCharacterRule/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

绑定路径为方法的第一个参数。

使用的转换器是在资源中定义的DoubleToString

BindsDirectlyToSource属性设置为true,表示直接绑定到数据源对象,而不是是绑定到数据源对象的某个属性。

<Binding.ValidationRules>
     <local:InvalidCharacterRule/>
</Binding.ValidationRules>

image-20240621104346213

Binding.ValidationRules属性用于定义数据绑定的验证规则。这些规则用于在数据绑定过程中验证输入数据的有效性。如果数据不符合验证规则,WPF 可以显示错误信息或采取其他措施来处理无效数据。

这里使用的是InvalidCharacterRule对象。

<ComboBox Grid.Row="1" Grid.Column="2" 
SelectedValue="{Binding Source={StaticResource ConvertTemp},
Path=MethodParameters[1], BindsDirectlyToSource=true}">
        <local:TempType>Celsius</local:TempType>
        <local:TempType>Fahrenheit</local:TempType>
</ComboBox>

ComboBox绑定到方法的第二个参数。

<Label Content="{Binding Source={StaticResource ConvertTemp}}"
Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2"/>

绑定到方法的返回值。

现在查看这个方法:

  public string ConvertTemp(double degree, TempType temptype)
  {
      Type = temptype;
      switch (temptype)
      {
          case TempType.Celsius:
              return (degree*9/5 + 32).ToString(CultureInfo.InvariantCulture) + " " + "Fahrenheit";
          case TempType.Fahrenheit:
              return ((degree - 32)/9*5).ToString(CultureInfo.InvariantCulture) + " " + "Celsius";
      }
      return "Unknown Type";
  }

绑定过程梳理

该Demo启动后的界面如下所示:

image-20240621105239909

 <ObjectDataProvider ObjectType="{x:Type local:TemperatureScale}"
                     MethodName="ConvertTemp" x:Key="ConvertTemp">
     <ObjectDataProvider.MethodParameters>
         <system:Double>0</system:Double>
         <local:TempType>Celsius</local:TempType>
     </ObjectDataProvider.MethodParameters>
 </ObjectDataProvider>

ObjectDataProvider.MethodParameters中设置了方法的参数为0和Celsius。

而0是Double类型,TextBox需要string类型,因此设置了DoubleToString转换器。

该转换器代码如下所示:

 public class DoubleToString : IValueConverter
 {
     public object Convert(object value, Type targetType, object parameter,
         CultureInfo culture) => value?.ToString();

     public object ConvertBack(object value, Type targetType, object parameter,
         CultureInfo culture)
     {
         var strValue = value as string;
         if (strValue != null)
         {
             double result;
             var converted = double.TryParse(strValue, out result);
             if (converted)
             {
                 return result;
             }
         }
         return null;
     }
 }
<ComboBox Grid.Row="1" Grid.Column="2" 
SelectedValue="{Binding Source={StaticResource ConvertTemp},
Path=MethodParameters[1], BindsDirectlyToSource=true}">
        <local:TempType>Celsius</local:TempType>
        <local:TempType>Fahrenheit</local:TempType>
</ComboBox>

ComboBox的SelectedValue绑定到方法的第二个参数,刚开始也就是Celsius。

<Label Content="{Binding Source={StaticResource ConvertTemp}}"
Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2"/>

绑定到方法的返回值。

在TextBox中输入了做了数据绑定的验证规则。

InvalidCharacterRule类代码如下所示:

internal class InvalidCharacterRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var myvalue = 0.00;

        try
        {
            if (((string) value).Length > 0)
                myvalue = double.Parse((string) value);
        }
        catch (Exception e)
        {
            return new ValidationResult(false, "Illegal characters or " + e.Message);
        }

        return new ValidationResult(true, null);
    }
}

当输入不符合规则时,会有提示,如下图所示:

image-20240621110313599

代码来源

[WPF-Samples/Data Binding/BindingToMethod at main · microsoft/WPF-Samples (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Data Binding/BindingToMethod)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

湖南科技大学24计算机考研情况,软工学硕考数二,分数线290分,录取均分321分!

湖南科技大学&#xff08;Hunan University of Science and Technology&#xff09;坐落在伟人故里、人文圣地湘潭&#xff0c;处于长株潭核心区域&#xff0c;比邻湘潭九华经济技术开发区&#xff08;国家级&#xff09;&#xff0c;是应急管理部、国家国防科技工业局与湖南省…

全面国产化之路-信创

概叙 信创&#xff0c;即信息技术应用创新产业&#xff0c;这个词儿最早来源于“信创工委会”&#xff08;全称是信息技术应用创新工作委员会&#xff09;&#xff0c;是在2016年由24家专业从事软硬件关键技术研究及应用的国内单位共同发起成立的一个非营利性社会组织。后…

vulnhub靶场之FunBox-11

一.环境搭建 1.靶场描述 As always, its a very easy box for beginners. Add to your /etc/hosts: funbox11 This works better with VirtualBox rather than VMware. 2.靶场下载 https://www.vulnhub.com/entry/funbox-scriptkiddie,725/ 3.靶场启动 二.信息收集 1.寻找靶…

Python文件与面向对象知识点

目录 文件的基本概念 文件的读取 文件的追加 文件的写入 with语句 知识总结 面向对象的基本概念 类和实例 对象的属性和方法 类属性与方法 面向对象的三大特性 知识总结 文件的基本概念 文件的读取 文件的追加 文件的写入 with语句 知识总结 面向对象的基本概念 …

vue项目build 打包之后如何本地访问

vue项目build 打包之后如何本地访问 注意&#xff1a;vue项目build打包后 如果想实现本地访问 不能直接打开访问dist文件中的HTML文件&#xff08;因为页面带会报错打不开。&#xff09;&#xff0c;需要启一个服务&#xff0c;通过服务来访问&#xff1a; 具体操作过程如下&am…

Avalonia:一个.NET跨平台UI框架

概述 Avalonia是一个强大的框架&#xff0c;使开发人员能够使用. NET创建跨平台应用程序。它使用自己的渲染引擎来绘制UI控件&#xff0c;确保在各种平台上保持一致的外观和行为&#xff0c;包括Windows&#xff0c;macOS&#xff0c;Linux&#xff0c;Android&#xff0c;iOS…

Omnivore:全能开源稍后阅读神器,让文字爱好者畅享阅读乐趣!

热门开源项目推荐 项目地址&#x1f517;&#x1f517;&#x1f517;&#x1f517; https://gitcode.com/omnivore-app/omnivore/overview Omnivore&#xff1a;全能开源稍后阅读神器 Omnivore App 介绍 Omnivore是一个完整的开源稍后阅读解决方案&#xff0c;专为喜欢文字…

复分析——第6章—— Γ 函数和 ζ 函数(E.M. Stein R. Shakarchi)

第6章 Γ函数和Ζ函数(The Gamma and Zeta Functions) 毫不夸张地说&#xff0c;Γ函数和Ζ函数是数学中最重要的非初等函数之一。Γ函数在自然界中无处不在。它出现在大量计算中&#xff0c;并以分析中出现的大量恒等式为特征。对此的部分解释可能在于Γ函数的基本结构特性&…

树和二叉树的定义

目录 一、树的定义 1.1概念 1.2表示方式 1.3基本术语 1.4树结构和线性结构的比较 二、二叉树的定义 2.1概念 2.2二叉树的5种基本形态 三、二叉树的性质和存储结构 3.1二叉树的性质 3.1.1满二叉树 3.1.2完全二叉树 3.2二叉树的存储结构 3.2.1二叉树的顺序存储 3.2.…

Go语言开发框架GoFly已集成数据可视化大屏开发功能,让开发者只专注业务开发,本文指导大家如何使用

前言 框架提供数据大屏开发基础&#xff0c;是考虑当前市场软件应用有一大部分是需要把业务数据做出大屏&#xff0c;很多政府项目对大屏需求特别高&#xff0c;还有生产企业项目也对大屏有需求&#xff0c;没有提供基础规范的后台框架&#xff0c;在开发大屏需要很多时间去基…

AI大模型填报高考志愿靠谱吗?AI自己说:完全靠我不行

靠天靠地靠AI&#xff0c;最后还得靠自己。 2024年高考已经结束。近日&#xff0c;全国多个省份陆续公布高考查分时间和方式&#xff0c;大部分集中在6月25日左右。报什么学校、选什么专业&#xff0c;又成为考生和家长面临的一次大考。 人们常说&#xff0c;“高考七分报&am…

C malloc经典面试题解答与分析

本篇博客介绍关于C malloc经典的错误代码写法以及解决方法。 题目1 错误的代码&#xff1a; #include <iostream>void test01(char* p) {p (char*)malloc(10); }int main1() {char* p NULL;test01(&p);const char* str "hello";strcpy(p, str);print…

基于STM32的智能温室控制系统

目录 引言环境准备智能温室控制系统基础代码实现&#xff1a;实现智能温室控制系统 4.1 温湿度传感器数据采集4.2 光照传感器数据采集4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能温室管理与优化问题解决方案与优化收尾与总结 1. 引言 智能温室控制系…

Nodejs 第七十九章(Kafka进阶)

kafka前置知识在上一章讲过了 不再复述 kafka进阶 1. server.properties配置文件 server.properties是Kafka服务器的配置文件&#xff0c;它用于配置Kafka服务的各个方面&#xff0c;包括网络设置、日志存储、消息保留策略、安全认证 #broker的全局唯一编号&#xff0c;不能…

Ubuntu系统如何配置通过图形界面登录root用户

Ubuntu系统中的root账号默认是锁定的&#xff0c;但可以通过设置密码来启用。 需要注意的是&#xff0c;由于root用户具有对系统完全控制的权限&#xff0c;因此在使用root账户时应格外小心。一个错误的命令可能会导致系统损坏&#xff0c;这就是为什么Ubuntu默认不启用root账户…

[SAP ABAP] 变量与常量

1.变量 定义变量的基本方式 DATA <name> TYPE <type> [VALUE <val>]. <name>&#xff1a;指定变量的名称 <type>&#xff1a;指定变量的数据类型 <val>&#xff1a;指定<name>的初始值 示例1 定义变量lv_data1和lv_data3 输出结果…

qt 简单实验 画一个等边三角形

1.概要 2.代码 2.1 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr)…

U盘文件夹损坏0字节:现象解析、恢复方法与预防措施

在日常工作和生活中&#xff0c;U盘因其便携性和大容量成为我们存储和传输数据的重要工具。然而&#xff0c;当U盘中的文件夹突然损坏并显示为0字节时&#xff0c;我们可能会感到困惑和焦虑。本文将对U盘文件夹损坏0字节的现象进行详细描述&#xff0c;分析其可能的原因&#x…

python基础篇(3):print()补偿知识点

1 print输出不换行 默认print语句输出内容会自动换行&#xff0c;如下&#xff1a; print("hello") print(" world") 结果&#xff1a; 在print语句中&#xff0c;加上 end’’ 即可输出不换行了 print("hello",end) print(" world&quo…

pywinauto入门指南:轻松掌握Windows GUI自动化

pywinauto库概述: pywinauto是一个Python库,主要用于自动化Windows应用程序的GUI测试和操作.它提供了一组简单而强大的API,可以模拟用户与Windows应用程序的交互,包括点击按钮、输入文本、选择菜单等操作. 安装 ##pywinauto可以通过pip进行安装,打开命令行运行: pip install…