wpf - 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 文本框更改一次,并且从后面的代码更改一次,我也无法找到它行为不同的原因。
解决方案
推荐阅读
- python - 模拟多参数函数,如何指定规格?
- c++ - 谷歌模拟重载解决方案
- flask - 为什么我在使用 flask_cors 时会出现 CORS 错误?
- javascript - 如果时间戳是通过日期或未来日期,如何在 firebase 中订购和分离文档?
- laravel - Laravel 默认使用 Vuejs 进行身份验证,仅在登录后提供 spa
- android - Android Emulator 在启动时挂起并黑屏
- javascript - 从数组中删除重复项并替换
- c++ - 尝试用 C++ 创建管道模式
- java - 为什么我在 JCS 相位器测试中从未看到比赛结果
- moodle - moodle - 运行 sync.php 脚本时数据库连接失败