我看到了:
Using WPF Validation rules and disabling a 'Save' button
两个建议的解决方案使用IDataErrorInfo
或将处理程序附加到Validation.ErrorEvent
Validation.AddErrorHandler()
。 AddErrorHandler接受两个参数,依赖项对象和处理程序。由于我在ViewModel中执行此操作,并且没有引用DO,因此如何通过使用自定义规则进行验证来实现此目的。
验证规则:
public class NameValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (string.IsNullOrWhiteSpace(((string)value)))
{
return new ValidationResult(false, "Must not be empty");
}
return new ValidationResult(true, null);
}
}
使用它的控件:
<TextBox>
<TextBox.Text>
<Binding Path="Customer.FirstName" UpdateSourceTrigger="LostFocus" ValidatesOnDataErrors="True">
<Binding.ValidationRules>
<validators:NameValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<Button Content="Save" Command="{Binding SaveAddCommand}" CommandParameter="{Binding Customer}"/>
那么,当文本框验证规则返回false时,是否有'MVVM'方法可以更改CanExecute
的{{1}},而无需在代码behing中提供依赖项对象{ {1}}?
答案 0 :(得分:0)
我认为这应该有效:
public class NameValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (string.IsNullOrWhiteSpace(((string)value)))
{
return new ValidationResult(false, "Must not be empty");
ButtonSave.IsEnabled = false;
}
return new ValidationResult(true, null);
}
}
我希望它适合你;)
答案 1 :(得分:0)
执行此操作的一种方法是让Command
实施提升CanExecuteChanged
这将重新查询命令CanExecute
方法。
如果您MainViewModel
能够了解孩子vm(如客户),则可以通过Customer
VM创建事件来进行更改。因此,当在Customer
中设置属性时,MainViewModel
可以提升CanExecuteChanged
并重新评估指定命令的条件。这样就不需要一起进行自定义验证,只需MainViewModel
Command
控制按钮的可用性,就像WPF
期望的那样。
HTH
附:如果您需要更多帮助,请告诉我们,编码愉快
编辑:假设您的MainViewModel
有SaveAddCommand
。