强制 WPF TextBox 在 .NET 4.0 中不再工作

2024-01-01

在我的 WPF 应用程序中,我有一个文本框,用户可以在其中输入百分比(作为 int,介于 1 和 100 之间)。 Text 属性与 ViewModel 中的属性进行数据绑定,我在其中强制将值置于 setter 中的给定范围内。

但是,在 .NET 3.5 中,数据在强制后无法在 UI 中正确显示。在MSDN 上的这篇文章 http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c404360c-8e31-4a85-9762-0324ed8812ef/,WPF 博士指出您必须手动更新绑定,以便显示正确的内容。因此,我有一个TextChanged处理程序(在视图中)调用UpdateTarget()。在代码中:

查看 XAML:

<TextBox Text="{Binding Percentage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, TargetNullValue={x:Static sys:String.Empty}}"
    TextChanged="TextBox_TextChanged"/>

查看隐藏代码:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    // Removed safe casts and null checks
    ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateTarget();
}

视图模型:

private int? percentage;
public int? Percentage
{
    get
    {
        return this.percentage;
    }

    set
    {
        if (this.Percentage == value)
        {
            return;
        }

        // Unset = 1
        this.percentage = value ?? 1;

        // Coerce to be between 1 and 100.
        // Using the TextBox, a user may attempt setting a larger or smaller value.
        if (this.Percentage < 1)
        {
            this.percentage = 1;
        }
        else if (this.Percentage > 100)
        {
            this.percentage = 100;
        }
        this.NotifyPropertyChanged("Percentage");
    }
}

不幸的是,此代码在 .NET 4.0 中中断(相同的代码,只是将 TargetFramework 更改为 4.0)。具体来说,在我第一次强制转换该值后,只要我继续输入整数值(因为我绑定到 int),文本框就会忽略任何进一步的强制转换值。

因此,如果我输入“123”,则在 3 之后我会看到值“100”。现在,如果我输入“4”,ViewModel 中的设置器将获取值“1004”,并将其强制为 100。然后触发 TextChanged 事件(发送者的 TextBox.Text 为“100”!),但 TextBox 显示“ 1004”。如果我输入“5”,设置器将获得值“10045”等。

如果我输入“a”,文本框会突然显示正确的值,即“100”。如果我继续输入数字直到 int 溢出,也会发生同样的情况。

我怎样才能解决这个问题?


尝试在 xaml Explicit 中使用而不是 PropertyChanged:

<TextBox Text="{Binding Percentage, Mode=TwoWay, UpdateSourceTrigger=Explicit, TargetNullValue={x:Static System:String.Empty}}"
             TextChanged="TextBox_TextChanged" />

并在 UpdateSource 而不是 UpdateTarget 后面的代码中

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        // Removed safe casts and null checks
        ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }

测试了一下,它有效。 顺便说一句,这个问题可能会在.NET 的更高版本中得到解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制 WPF TextBox 在 .NET 4.0 中不再工作 的相关文章

随机推荐

  • 配置驱动的 GWT UI 是否可行?

    我想要一个 GWT 应用程序 其 UI 是配置驱动的 这意味着如果我进行某些数据库更改 或部署不同的 XML 描述符 在 WAR 之外 那么我可以更改其外观 感觉和行为用户界面无需部署任何代码更改 我想要这个的原因超出了这个问题的背景 我需
  • 使用 Kafka SASL/PLAIN 身份验证的 Spark 结构化流

    有没有办法将 Spark 结构化流作业连接到受 SASL PLAIN 身份验证保护的 Kafka 集群 我在想类似的事情 val df2 spark read format kafka option kafka bootstrap serv
  • C# 电子邮件主题解析

    我正在用 C 构建一个用于阅读电子邮件的系统 我在解析主题时遇到问题 我认为该问题与编码有关 我正在阅读的主题如下 ISO 8859 1 Q E6 F8sd E5f F8sdf sdfsdf 原来发送的主题是 sd f sdf sdfsdf
  • 如何将 fit_generator 与分成批次的顺序数据一起使用?

    我正在尝试为我的 Keras lstm 模型编写一个生成器 与 fit generator 方法一起使用 我的第一个问题是我的发电机应该返回什么 一批 一个序列 Keras 文档中的示例为每个数据条目返回 x y 但如果我的数据是连续的怎么
  • 切换全屏退出

    我有以下由 HTML 中的按钮触发的 javascript function toggleFullScreen if v requestFullScreen v requestFullScreen else if v webkitReque
  • 检查字符串是否为回文

    我有一个字符串作为输入 必须将字符串分成两个子字符串 如果左子串等于右子串 则执行一些逻辑 我怎样才能做到这一点 Sample public bool getStatus string myString 例子 myString ankYkn
  • Bootstrap - 关于字体文件(.eot .svg .ttf .woff 和 .woff2)角色和用法

    在Bootstrap 3的fonts文件夹中 我们可以看到这些文件 glyphicons halflings regular eot 字形半身人 regular svg 字形半身人 regular ttf glyphicons halfli
  • 我什么时候必须创建异步存根

    ManagedChannel managedChannel ManagedChannelBuilder forAddress localhost 8888 usePlaintext build Grpc Stub stub CLIGrpc
  • Android 中最近的设备更新存在 Toast 通知问题

    这篇文章与现有的已提交错误相关 https groups google com forum topic android developers K7pjy3Gm5Lk discussion https groups google com fo
  • WPF加载序列化图像

    在应用程序中 我需要通过二进制编写器序列化图像 并将其获取到其他应用程序中以显示它 这是我的 序列化 代码的一部分 FileStream fs new FileStream file FileMode Create FileAccess W
  • 使用 ImageIO.read 时出现问题

    好的 我有一张正在尝试阅读的图像 问题是 Image read file 返回 NULL File file new File C images image1 jpg if file exists System out println Im
  • 如何设置“UILabel”的字符间距(紧排)和删除线样式?

    我需要为由 a 呈现的文本设置两个属性UILabel 字母之间的间距 kern 及其删除线样式 基于NSAttributedStringKey文档 我已经创建了以下扩展UILabel extension UILabel func setSt
  • WCF 使用匿名方法关闭连接

    在我们的项目中 我们使用以下代码进行 WCF 调用 In generated Proxy we have public static ICustomer Customer get ChannelFactory
  • ZF2 Form Hydration 具有多个对象和字段集

    我正在努力尝试弄清楚如何使用单个表单编辑多个模型 我有一个名为 Teams 的数据库表和一个与该表关联的条令实体 我创建一个表格如下 我的团队字段集 class TeamFieldset extends AbstractFieldset i
  • 我可以在 C++ 工厂中声明的同一行使用变量吗?

    我有一个多态的类层次结构 虽然我也支持标准工厂方法 即仅使用基类指针 但我还想要一个为我提供派生类的工厂机制 这并不容易 因为这些函数仅在返回类型上有所不同 这就是为什么我想到重载函数并让编译器选择正确的函数的原因 一个简单的应用是 我可以
  • F# 的情况如何? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 简单的 C Java 代码非常难以并行化 多线程等 因此 简单的 C Java 代码将使用越来越少的机器上的总处理能力 因为现在一切都将是多核的
  • 两个类之间的 ActionListener

    导入 javax swing 类标签扩展 JFrame JPanel pnl new JPanel ImageIcon duke new ImageIcon duke png JLabel lbl1 new JLabel duke JLab
  • 升级到 Google Play Services 9.0.0 后,应用程序在 DynamiteModulesC 中挂起

    通过这些更改和重新生成 将开发中的应用程序升级到 9 0 0google services json classpath com google gms google services 3 0 0 compile com google and
  • 如何在 VS Code 中正确集成 Cmder 2021 年 4 月?

    我想将 Cmder 集成到我的 Vscode 设置中 但在 2021 年 4 月的 vscode 更新中 命令 terminal integrated shell windows 和 terminal integrated shellArg
  • 强制 WPF TextBox 在 .NET 4.0 中不再工作

    在我的 WPF 应用程序中 我有一个文本框 用户可以在其中输入百分比 作为 int 介于 1 和 100 之间 Text 属性与 ViewModel 中的属性进行数据绑定 我在其中强制将值置于 setter 中的给定范围内 但是 在 NET