代码之家  ›  专栏  ›  技术社区  ›  GaryX

WPF从自定义验证规则获取实际值

  •  2
  • GaryX  · 技术社区  · 14 年前

    我使用自定义验证规则来验证我的数据。但我无法访问/确定属性值。

      public class MandatoryRule: ValidationRule
    {
        public MandatoryRule()
        {
            ValidationStep = System.Windows.Controls.ValidationStep.UpdatedValue;
        }
    
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            BindingExpression exp = value as BindingExpression;
    
            if (value == null)
                return new ValidationResult(true, null);
    
            return new ValidationResult(true, null);
        }
    }
    

    我需要将ValidationStep设置为UpdatedValue(用于进一步的业务逻辑)

    然后问题来了:我不知道财产的价值是多少?因为:

    1. Validate方法的参数中的值是BindingExpression

    那么我如何才能读到真正的价值呢?

    2 回复  |  直到 14 年前
        1
  •  1
  •   GaryX    14 年前

    最后,我想出了这个主意。

    创建类DummyObject:DependencyObject。 创建公共静态DependencyProperty DummyProperty。

    然后创建一个新的数据绑定,从(值为BindingExpression.ParentBinding)中复制源、绑定路径、元素名称、转换器等。

    然后使用绑定UpdateTarget()

    现在您可以从dummyproperty访问该值。

        2
  •  1
  •   Ian Oakes    14 年前

    public class BindingExpressionEvaluator : DependencyObject
    {
        public object Value
        {
            get { return (object)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }
    
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("ValueProperty", typeof(object), 
            typeof(BindingExpressionEvaluator), new UIPropertyMetadata(null));
    
        public static object Evaluate(BindingExpression expression)
        {
            var evaluator = new BindingExpressionEvaluator();
            var binding = new Binding(expression.ParentBinding.Path.Path);
            binding.Source = expression.DataItem;
            BindingOperations.SetBinding(evaluator,  BindingExpressionEvaluator.ValueProperty, binding);
            var value = evaluator.Value;
            BindingOperations.ClearBinding(evaluator, BindingExpressionEvaluator.ValueProperty);
            return value;
        }
    }
    
    推荐文章