2

我必须在 xaml 中调用validationRules,并且我想将viewmodel(即在datacontext 中)属性作为参数传递。我怎么能做到这一点?

                    <Binding.ValidationRules>
                        <vm:RiskCodeValidation/>
                    </Binding.ValidationRules> 
4

2 回答 2

3

如果将 ValidationRule.ValidationStep 设置为 ValidationStep.CommitedValue 或 ValidationStep.UpdatedValue,则 Validate 方法中的 value 参数将是 BindingExpression 类型,您可以通过 BindingExpression.DataItem 属性获取 DataContext。

不幸的是,它只有在绑定源更新后才能工作。


这是一个例子:

public class RiskCodeValidation : ValidationRule
{
    public RiskCodeValidation()
        : base(ValidationStep.CommittedValue, true)
    {
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var expression = value as BindingExpression;
        if (expression != null)
        {
            var sourceItem = expression.DataItem;
            if (sourceItem != null)
            {
                var propertyName = expression.ParentBinding != null && expression.ParentBinding.Path != null ? expression.ParentBinding.Path.Path : null;
                var sourceValue = sourceItem.GetType().GetProperty(propertyName).GetValue(sourceItem, null);

                // TODO: do validation logic based on sourceItem, propertyName and sourceValue.
            }
        }

        return ValidationResult.ValidResult;
    }
}
于 2012-06-12T08:00:29.493 回答
0

我要去 WPF ValidationRules 的一个已知限制。我无法绑定依赖属性做 ValidationRules' 属性。这个问题在这里得到解释和解决(由于 WPF 的限制,仍然是丑陋的解决方案):

http://michlg.wordpress.com/2010/01/29/wpf-custom-validationrule-with-an-additional-parameter/

http://www.codeproject.com/Articles/18678/Attaching-a-Virtual-Branch-to-the-Logical-Tree-in

http://www.11011.net/wpf-binding-properties

或者干脆使用 System.ComponentModel.IDataErrorInfo - 现在要关注这个。

于 2012-06-12T07:24:56.293 回答