首页 > 解决方案 > WPF:从后面的代码更改属性时,未应用内置数据错误模板(红色边框)

问题描述

我正在创建一个 WPF 应用程序,其中一个字段是 UnitCost,它是类中的一个属性。我已经在持有这个属性的类上实现了 INotifyPropertyChanged。我有一个验证逻辑,当 UnitCost 小于 0 时会引发异常。我还使用了 ValidatesOnExceptions 和 NotifyOnValidationError 属性都设置为 true。现在,当我从 UI 更改内部绑定到 UnitCost 属性的文本框并输入负值时,会显示一个红色装饰器。但是,我的应用程序中有一个流程,它从后面的代码中更改了 UnitCost。在这种情况下,我没有看到任何红色装饰器并且我的应用程序崩溃了。当我直接从 UI 更改 UnitCost 以及从后面的代码更改它时,我无法理解为什么应用程序的行为方式不同。示例代码:

public class Product : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        private decimal unitCost;
        public decimal UnitCost
        {
            get { return unitCost; }
            set
            {
                if (value < 0)
                {
                    throw new ArgumentException("Unitcost cannot be negative");
                }

                unitCost = value;
                OnPropertyChanged("UnitCost");
            }
        }
    }

在 wpf 窗口中

 <TextBox x:Name="txtUnitCost" Margin="5" Grid.Row="2" Grid.Column="1" Text="{Binding UnitCost, ValidatesOnExceptions=True, NotifyOnValidationError=True}">
            </TextBox>

示例应用程序窗口

现在,当我从“更改单位代码”按钮旁边的文本框中更改单位成本时,应用程序崩溃。后面的代码是:

 private void ChangeUnitCostHandler(object sender, RoutedEventArgs e)
        {
            var product = (Database.Product)gridProductDetails.DataContext;
            decimal cost;
            decimal.TryParse(txtUnitCostChange.Text, out cost);
            product.UnitCost = cost;
        }

在调试它直到 throw 语句,抛出异常和应用程序崩溃。即使相同的 UnitCost 属性从 UI 直接从 Unit Cost 文本框更改一次,并且从后面的代码更改一次,我也无法找到它行为不同的原因。

标签: wpfdata-binding

解决方案


推荐阅读