c# - TextBox 不遵守 Get 返回的值

标签 c# .net wpf binding textbox

有一个我想限制输入范围的文本框。
在这个简单的例子中,Int32 从 0 到 300。
在现实生活中,范围更复杂,除了接收并显示有效值外,我不想让 UI 参与进来。

如果我输入 333,它会返回 300,而 300 在 TextBox 中。

问题来了:
然后,如果我为 3001 添加一个数字,则集合分配的值为 300。
调用 get 并返回 300。
但 3001 仍在 TextBox 中。

如果我粘贴 3001,那么它会正确显示 300。
只有当一次击键产生 4 个(或更多)数字时,它才会失败。

<TextBox Text="{Binding Path=LimitInt, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="60" Height="20"/>

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private Int32 limitInt = 0;

    public MainWindow()
    {
        InitializeComponent();
    }

    public Int32 LimitInt
    {
        get { return limitInt; }
        set
        {
            if (limitInt == value) return;
            limitInt = value;
            if (limitInt < 0) limitInt = 0;
            if (limitInt > 300) limitInt = 300; 
            NotifyPropertyChanged("LimitInt");
        }
    }
}

最佳答案

我相信发生这种情况是因为您在绑定(bind)操作的中间更改了绑定(bind)源的值。当您在绑定(bind)上使用 UpdateSourceTrigger=PropertyChanged 时,您是在告诉它在每次按键时重新评估。在这种情况下,Binding 会将值推送到源,而不是尝试通过从源拉取来更新目标。

即使在您提高 NotifyPropertyChanged 之后,我想因为您正处于绑定(bind)操作的中间,所以 Target 没有得到更新。

您可以通过删除 UpdateSourceTrigger 并将其保留为默认值 (LostFocus) 来解决此问题。只要您对用户退出后发生的事情感到满意,这样做就会奏效。

<TextBox Text="{Binding Path=LimitInt}" Width="60" Height="20"/>

(Mode=TwoWay 是 TextBox 的默认值,因此您也可以将其删除)。

如果您想在每次按键时对其进行评估,我建议您研究屏蔽编辑,并处理按键/按键,这样您就可以防止将值输入到 TextBox 中,而不是尝试在输入后更改它们。

关于c# - TextBox 不遵守 Get 返回的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15255893/

相关文章:

javascript - 如何使用 javascript 和 asp.net 获取 gridview 中选中的行单元格值

c# - 类型转发

c# - 谷歌翻译 C#

c# - 处理 XML 文件会删除注释

c# - 为什么这个数据网格需要额外的绑定(bind)语法?

wpf - 如何提高 WPF 应用程序的性能

c# - StringBuilder 中的换行符

C#:使用可空 bool 的空合并运算符给出(我认为的)不正确的结果

c# - 方法内联如何用于 C# 中的自动属性?

wpf - 以编程方式发出命令