我有这样的文本框声明:
<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");
}
}
}
如果我输入“valid”然后“invalid”,则执行命令时,属性Input将被设置为“valid”值状态。 我尝试使用UpdateSourceTrigger =“Explicit”并使用TextChanged事件的另一种方法 - 仍然是相同的结果。
没有ValidationRule - 一切正常。
P.S。我无法从模型层更改类。
答案 0 :(得分:0)
嗨设置UpdateSourceTrigger =“PropertyChanged”。我希望这会有所帮助。
答案 1 :(得分:0)
如果您希望验证/ viewmodel和您的“ui”同步,那么您应该使用IDataErrorInfo。您的Input属性应保存“有效”和“无效”值。