編集: これは、この投稿の元のバージョンの簡略化された更新です。
WPFでは、 TextBox (xaml)のTextプロパティと同期する *DependencyProperty 'Value' を使用するUserControl ('NumericTextBox' と呼ばれる)を実装しました。
<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 :ethicallogicsの回答に基づいて、コードを再構築しました。NumericTextBoxは、NumericTextBoxによって宣言されたTextBoxのTextプロパティにバインドされるDependency Property Valueを提供する基礎となるビューモデル クラスを使用するようになりました。さらに、 NumericTextBoxはビューモデルをデータコンテキストとして使用します。ビューモデルは現在、Value プロパティの変更をチェックする責任があります。NumericTextBoxの値の制限はカスタマイズ可能であるため (たとえば、最小値を調整できます)、これらの設定をビューモデル オブジェクトに転送します。