文本框不接受Get返回的值

本文关键字:返回 Get 不接受 文本 | 更新日期: 2023-09-27 18:02:32

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

如果我输入333,它会返回300,300在文本框中。

问题来了:
然后,如果我给3001加一个数字,那么集合赋值为300。
Get被调用并返回300。
但是3001仍然在文本框中

如果我粘贴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");
        }
    }
}

文本框不接受Get返回的值

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

即使在你触发NotifyPropertyChanged之后,我认为因为你处于绑定操作的中间,Target不会得到更新。

您可以通过删除UpdateSourceTrigger并将其保留为默认值(LostFocus)来解决此问题。这样做是可行的,只要你习惯在用户退出选项卡后进行。

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

(Mode= two - way是TextBox的默认设置,所以你也可以删除它)

如果你想在每个按键上评估它,我建议查看遮罩编辑,并处理按键/按键,这样你就可以防止值被输入到TextBox中,而不是试图在输入后更改它们。

最好使用验证。

方法如下:

定义XAML来检查PreviewTextInput

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

然后设置您的验证处理程序:

/// <summary>
/// Check to make sure the input is valid
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckNumberValidationHandler(object sender, TextCompositionEventArgs e) {
    if(IsTextAllowed(e.Text)) {
    Int32 newVal;
    newVal = Int32.Parse(LimitInt.ToString() + e.Text);
    if(newVal < 0) {
        LimitInt = 0;
        e.Handled = true;
    }
    else if(newVal > 300) {
        LimitInt = 300;
        e.Handled = true;
    }
    else {
        e.Handled = false;
    }
    }
    else {
    e.Handled = true;
    }
}
/// <summary>
/// Check if Text is allowed
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
private static bool IsTextAllowed(string text) {
    Regex regex = new Regex("[^0-9]+");
    return !regex.IsMatch(text);
}

编辑:我检查过了,它可以在。net 4.0中工作:)