编辑:这是这篇文章原始版本的简化更新。
在 WPF 中,我实现了一个UserControl (称为“NumericTextBox”),它使用与TextBox(xaml)的Text属性保持同步的 *DependencyProperty“Value” :
<TextBox.Text>
<Binding Path="Value"
Mode="TwoWay"
ValidatesOnDataErrors="True"
NotifyOnValidationError="True"
UpdateSourceTrigger="PropertyChanged" />
</TextBox.Text>
出于验证目的,我使用IDataErrorInfo接口 (xaml.cs):
public partial class NumericTextbox : Textbox, IDataErrorInfo {
public double Value {
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(double),
typeof(NumericTextBox),
new PropertyMetadata(default(double)));
public string this[string columnName]
{
// Never gets called!
get { /* Some validation rules here */ }
}
}
如源代码中所述,该get
属性实际上从未被调用,因此不会发生验证。你看到问题的原因了吗?
Edit2:根据伦理逻辑的回答,我重构了我的代码。NumericTextBox现在使用一个底层视图模型类,该类提供一个依赖属性值,该值绑定到由NumericTextBox声明的TextBox的Text属性。此外, NumericTextBox使用视图模型作为其数据上下文。viewmodel 现在负责检查 Value 属性的变化。由于NumericTextBox的值限制是可定制的(例如可以调整最小值),它会将这些设置转发给 viewmodel 对象。