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

运行效果如下所示:

来看看是如何实现的。

先来看下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介绍

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

 <ObjectDataProvider MethodName="ConvertTemp" >

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

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

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>

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启动后的界面如下所示:

 <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);
}
}

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

代码来源

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

WPF/C#:数据绑定到方法的更多相关文章

  1. WPF:数据绑定总结(1) https://segmentfault.com/a/1190000012981745

    WPF:数据绑定总结(1) visual-studio c# 1.3k 次阅读  ·  读完需要 16 分钟 0 一.概念:什么是数据绑定? WPF中的数据绑定:是在应用程序 UI 与业务逻辑之间建立 ...

  2. WPF关闭应用程序方法

    很多人认为关闭应用程序应该很简单,例如WindowsForm里一个Application.Exit();方法就可以解决问题,但在WPF里面可别滥用,因为WPF里Application类没有该方法,倒是 ...

  3. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...

  4. WPF中TreeView.BringIntoView方法的替代方案

    原文:WPF中TreeView.BringIntoView方法的替代方案 WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoVie ...

  5. 【转】解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)

    解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight) 转载自:http://www.360doc.com/content/13/1126/09/10504424_332211 ...

  6. WPF去除边框的方法

    原文:WPF去除边框的方法 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangsen600/article/details/81978125 W ...

  7. wpf Content数据绑定StringFormat起作用的原理和解决

    原文:wpf Content数据绑定StringFormat起作用的原理和解决 <Window x:Class="WpfOne.Bind.Bind6" xmlns=" ...

  8. WPF的数据绑定详细介绍

    数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程. 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改. 数据绑定可能还意味着如果视觉元素中数据的 ...

  9. WPF之数据绑定

    WPF学习之数据绑定 1. Banding基础 WPF中的数据绑定提供了很强大的功能.与普通的WinForm程序相比,其绑定功能为我们提供了很多便利,例如Binding对象的自动通知/刷新,Conve ...

  10. WPF之数据绑定基类

    数据绑定方法 在使用集合类型作为列表控件的ItemsSource时一般会考虑使用ObservalbeCollection,它实现了INotifyCollectionChanged和INotifyPro ...

随机推荐

  1. 使用 Silk.NET 创建 OpenGL 空窗口项目例子

    本文告诉大家如何使用 Silk.NET 创建 OpenGL 空窗口项目.在 dotnet 基金会下,开源维护 Silk.NET 仓库,此仓库提供了渲染相关的封装逻辑,包括 DX 和 OpenGL 等等 ...

  2. dotnet C# 只创建对象不调用构造函数方法

    有时我期望只是创建出对象,但是不要调用对象的构造方法,可以通过使用 FormatterServices 的 GetUninitializedObject 函数来实现只创建对象不调用构造函数方法 这个 ...

  3. Premiere cc 2019之声音处理

    目录 deepin录视频 调整声道 查看声音轨道 转化格式 提取二声道的台词音,或者背景音 降噪 1.无需AU!PR自带音频模块完美实现降噪.增强人声.模拟环境 2.Adobe audition中降噪 ...

  4. GaussDB细粒度资源管控技术透视

    本文分享自华为云社区<[GaussTech速递]技术解读之细粒度资源管控>,作者:GaussDB 数据库. 背景 对数据库集群内资源管控与资源隔离一直是企业客户长久以来的诉求.华为云Gau ...

  5. VForm

    VForm是一款基于Vue 2/Vue 3的低代码表单,支持Element UI.iView两种UI库,定位为前端开发人员提供快速搭建表单.实现表单交互和数据收集的功能. VForm全称为Varian ...

  6. PPO-KL散度近端策略优化玩cartpole游戏

    其实KL散度在这个游戏里的作用不大,游戏的action比较简单,不像LM里的action是一个很大的向量,可以直接用surr1,最大化surr1,实验测试确实是这样,而且KL的系数不能给太大,否则惩罚 ...

  7. openstack的用户(user), 租户(tenant), 角色(role)概念区分

    用户身份管理有三个主要的概念: 用户Users租户Tenants角色Roles1. 定义 这三个概念的openstack官网定义(点击打开链接) 1.1 用户(User) openstack官网定义U ...

  8. C# Bitmap 在winform里编辑了,再次重新编辑,报gdi+错误解决办法

    经过排查,var bitmap=new Bitmap()这个局部对象,没有Dispose所致.虽然是局部的对象,但还是需要Dispose:

  9. exe应用程序安装为windows服务

    1.使用instsrv.exe和srvany.exe 当你获取到srvany后并决定将某程序作为服务启动后,请先将srvany安装为系统服务,具体的安装方法有很多,这里使用instsrv,语法如下:安 ...

  10. OSGQt编译安装

    OSGQt编译安装 效果演示 1.准备工作 最新版的osg中不附带osgQt源码,所以需要单独下载编译 在编译osgQt前需要先编译osg源码,osg编译安装看这里 编译osgQt的环境与之前编译os ...