【问题标题】:Disabling a save button if validation result is false, by using custom ValidationRule如果验证结果为假,则使用自定义 ValidationRule 禁用保存按钮
【发布时间】:2015-10-22 08:39:51
【问题描述】:

我看到了:

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”方法可以更改 SaveAddCommandCanExecute,而无需在 AddHandler 的代码中提供依赖对象?

【问题讨论】:

    标签: c# wpf validation xaml mvvm


    【解决方案1】:

    我认为这应该可行:

     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);
            }
        }
    

    我希望它对你有用;)

    【讨论】:

      【解决方案2】:

      一种方法是让您的Command 实现提高CanExecuteChanged 这将重新查询命令CanExecute 方法。
      如果可以,您的MainViewModel 可以知道子虚拟机(如客户)的更改,即通过在Customer 虚拟机上创建事件。因此,当在Customer 中设置属性时,MainViewModel 可以引发CanExecuteChanged 并重新评估指定命令的条件。这将消除自定义验证的需要,让MainViewModel Command 控制按钮的可用性,就像WPF 期望的那样。
      HTH
      附言如果您需要更多帮助,请告诉我们,祝您编码愉快
      编辑:这是假设您的MainViewModel 具有SaveAddCommand

      【讨论】:

        猜你喜欢
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多