私はそのようなテキストボックス宣言を持っています:
<TextBox x:Name="InputTextBox">
<Binding Path="Input" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<MyValidationRule
ErrorMessage="Invalid" />
</Binding.ValidationRules>
</Binding>
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding Path=AddCommand}"/>
</InputBindings>
</TextBox>
このような validationRule 階層:
public abstract class AbstractValidationRule : ValidationRule
{
public string ErrorMessage { get; set; }
protected abstract bool IsValid(string inputString)
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
string inputString = (value ?? string.Empty).ToString();
if (!IsValid(inputString)) return new ValidationResult(false, ErrorMessage);
return new ValidationResult(true, null);
}
}
class MyValidationRule : AbstractStringValidationRule
{
protected override bool IsValid(string inputString)
{
return !String.IsNotNullOrEmpty(inputString);
}
}
コマンドを追加:
public ICommand AddCommand
{
get
{
return m_AddCommand ??
(m_AddCommand = new DelegateCommand(Add));
}
}
private void Add()
{
InternalValue = Input;
// input = Old invalid value
OnPropertyChanged("Input")
}
入力プロパティ:
public string Input
{
get { return m_Input; }
set
{
if (m_Input != value)
{
m_Input = value;
OnPropertyChanged("Input");
}
}
}
「有効」を入力してから「無効」を入力すると、コマンド実行時にプロパティ入力が「有効」の値の状態に設定されます。UpdateSourceTrigger="Explicit" と TextChanged イベントを使用して別の方法を試しましたが、同じ結果でした。
ValidationRule なし - すべて正常に動作します。
PSモデルレイヤーからクラスを変更できません。