我有这样的文本框声明:
<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 我无法从模型层更改类。