ValidationRule绑定到Windows上下文

时间:2011-06-02 14:54:23

标签: wpf binding

我正在尝试制作ValidationRule,它依赖于(例如)数据模型中的某些属性。

我有带验证器的TextBox,它必须知道模型对象“Scheme”。我已经尝试将Scheme添加到Resources中,但这不起作用。在我找到一些依赖于依赖属性的解决方案之后。

根据http://dedjo.blogspot.com/2007/05/fully-binded-validation-by-using.html我做过:

/// <summary>
/// Check text value for emptiness and uniqueness
/// </summary>
public class EmptyAndUnique : ValidationRule
{
    public UniqueChecker UniqueChecker { get; set; }

    public string ErrorMessage { get; set; }

    public override ValidationResult Validate(object value,
        CultureInfo cultureInfo)
    {
        string inputString = (value).ToString();
        var result = new ValidationResult(true, null);

        // Check uniqueness
        if(this.UniqueChecker.Scheme.Factors.Any(f => f.Uid == inputString))
        {
            result = new ValidationResult(false, this.ErrorMessage);
            return result;
        }

        // Check emptiness
        if (inputString.Trim().Equals(string.Empty))
        {
            result = new ValidationResult(false, this.ErrorMessage);
            return result;
        }

        return result;
    }
}

/// <summary>
/// Wrapper for DependencyProperty. (trick)
/// </summary>
public class UniqueChecker : DependencyObject
{
    public static readonly DependencyProperty SchemeProperty =
        DependencyProperty.Register("Scheme", typeof(Scheme),
        typeof(UniqueChecker), new FrameworkPropertyMetadata(null));

    public Scheme Scheme
    {
        get { return (Scheme)GetValue(SchemeProperty); }
        set { SetValue(SchemeProperty, value); }
    }
}

                                                                                                                                                          

这也不起作用。

1)根据文章:

Scheme="{Binding      ElementName=expressionFactorEditorWindow, Path=Scheme}"

这不起作用,因为:

  

我们的依赖对象不是其中的一部分   逻辑树,所以你不能使用   ElementName或DataContext作为源   用于内部数据绑定。

但为什么它不是逻辑树的一部分?

2)如何将ValidationRule的属性绑定到某些动态资源

更新 在观察更好的解决方案时,我做到了这一点:

  1. 将检查唯一性的事件添加到ValidationRule
  2. 将处理程序添加到Window类
  3. 从ValidationRule提升事件并检查EventArgs
  4. 的结果

1 个答案:

答案 0 :(得分:0)

您试图为其添加验证有什么约束力。我通常通过让我绑定的对象实现IDataErrorInfo来处理这个问题。然后我可以将错误处理放在该对象中,并可以访问我需要的任何内容。如果您控制要绑定的对象,则可以执行此操作。