如果验证结果为false,则使用自定义ValidationRule禁用保存按钮

时间:2015-10-22 08:39:51

标签: c# wpf validation xaml mvvm

我看到了:

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}}?

2 个答案:

答案 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
附:如果您需要更多帮助,请告诉我们,编码愉快 编辑:假设您的MainViewModelSaveAddCommand