我必须在 xaml 中调用validationRules,并且我想将viewmodel(即在datacontext 中)属性作为参数传递。我怎么能做到这一点?
<Binding.ValidationRules>
<vm:RiskCodeValidation/>
</Binding.ValidationRules>
我必须在 xaml 中调用validationRules,并且我想将viewmodel(即在datacontext 中)属性作为参数传递。我怎么能做到这一点?
<Binding.ValidationRules>
<vm:RiskCodeValidation/>
</Binding.ValidationRules>
如果将 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;
}
}
我要去 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 - 现在要关注这个。