当绑定属性强制执行某些业务规则时,绑定的WPF文本框不更新值

本文关键字:绑定 文本 WPF 更新 强制执行 属性 规则 业务 | 更新日期: 2023-09-27 17:49:32

我使用的是。net 4.0。我有一些非常简单的代码,允许用户输入1到99,999(包括)之间的数字。我在Property setter中设置了一些逻辑,如果最新值不符合业务规则(例如,它不是数字或数字太大),则阻止应用该值。

    public class MainViewModel : INotifyPropertyChanged
{
    #region Fields
    private string _text = string.Empty;
    #endregion // Fields
    #region Properties
    public string Text
    {
        get { return _text; }
        set
        {
            if (_text == value) return;
            if (IsValidRange(value))
            {
                _text = value;
            }
            OnPropertyChanged("Text");
        }
    }
    #endregion // Properties
    #region Private Methods
    private bool IsValidRange(string value)
    {
        // An empty string is considered valid.
        if (string.IsNullOrWhiteSpace(value)) return true;
        // We try to convert to an unsigned integer, since negative bill numbers are not allowed,
        // nor are decimal places.
        uint num;
        if (!uint.TryParse(value, out num)) return false;
        // The value was successfully parse, so we know it is a non-negative integer.  Now, we
        // just need to make sure it is in the range of 1 - 99999, inclusive.
        return num >= 1 && num <= 99999;
    }
    #endregion // Private Methods
    #region INotifyPropertyChanged Implementation
    public event PropertyChangedEventHandler PropertyChanged;
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion // INotifyPropertyChanged Implementation
}

我遇到的问题是,当值是无效的,我只是忽略值,绑定到这个属性的文本框不更新,以反映这种变化;相反,它只保留输入的值。下面是我如何设置属性绑定的:

        <TextBox Grid.Row="0"
             Text="{Binding Path=Text, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
谁能告诉我我做错了什么?

我读过很多类似的问题,但是没有一个答案适合我。奇怪的是,当我不基于数字进行验证,而只是将所有输入的文本更改为大写时,它工作得很好。当我试图不将属性设置为新值时,它似乎不起作用。

当绑定属性强制执行某些业务规则时,绑定的WPF文本框不更新值

这似乎是。net 3.5-4.0中TextBox的一个bug。我第一次尝试在4.5和你的代码工作,但当我将项目转换为4.0,我可以重现这个问题。经过一番搜索,我发现:

WPF文本框在绑定到视图模型属性时拒绝更新自己,这详细说明了引用的解决方法:

文本框与viewmodel属性不同步。

当然,如果你有可能使用。net 4.5,我会建议你这样做,但当然,这并不总是那么容易。