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

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

在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)

目录
相关文章
|
1月前
|
SQL 开发框架 .NET
C#一分钟浅谈:数据绑定与数据源控件
在Web开发中,数据绑定和数据源控件是实现动态网页的关键技术。本文从基础概念入手,详细讲解数据绑定的原理及其在ASP.NET中的应用,并介绍常见数据绑定方式:手动绑定和自动绑定。接着,文章重点介绍了ASP.NET中的数据源控件,如`SqlDataSource`、`ObjectDataSource`、`XmlDataSource`和`LinqDataSource`,并通过具体示例演示如何使用`SqlDataSource`和`GridView`进行数据绑定。最后,还列举了一些常见问题及其解决办法,帮助读者更好地理解和应用这些技术。
61 4
|
2月前
|
开发框架 .NET 程序员
C# 去掉字符串最后一个字符的 4 种方法
在实际业务中,我们经常会遇到在循环中拼接字符串的场景,循环结束之后拼接得到的字符串的最后一个字符往往需要去掉,看看 C# 提供了哪4种方法可以高效去掉字符串的最后一个字符
282 0
|
1月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
116 65
|
6天前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
8天前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
26 3
|
1月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
39 1
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
2月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
114 3
|
1月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
15 0
|
1月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
46 0