2011-07-13 77 views

回答

0

我最近使用了这个以前的答案Detecting WPF Validation Errors的代码以达到良好的效果。

我有一个包含DataGrid的用户控件。用户控件暴露了一个IsValid属性包含一个getter,简单地调用静态的IsValid函数在数据网格传递作为DependencyObject的:

public class MyControl : UserControl 
{ 
    public bool IsValid 
    { 
     get { return Validator.IsValid(MyDataGrid); } 
    } 
} 

控制的IsValid属性就可以通过绑定命令的CanExecute功能检查到您要启用/禁用的按钮。

我与我链接的代码唯一的问题是,它实际上评估绑定的验证,这意味着只要你运行任何技术上无效但尚未失效的字段(即用户可能还没有进入该领域的任何数据,因为他们没有得到它)​​现在将处于无效状态 - 我还没有看过避免或减轻这种情况的方法。


编辑:

这里是一个更新的版本,因为我前面提到的那个不坏的控件。我只是简单地发表了一些评论,稍微改变了一些内容,但将所有内容都留在了那里,这样您就可以看到差异。请注意,这应该也会更快,因为当您找到第一个无效绑定时,您将退出。

public static bool IsValid(DependencyObject parent) 
{ 
    // Validate all the bindings on the parent 
    bool valid = true; 
    LocalValueEnumerator localValues = parent.GetLocalValueEnumerator(); 
    while (localValues.MoveNext()) 
    { 
     LocalValueEntry entry = localValues.Current; 
     if (BindingOperations.IsDataBound(parent, entry.Property)) 
     { 
      Binding binding = BindingOperations.GetBinding(parent, entry.Property); 
      foreach (ValidationRule rule in binding.ValidationRules) 
      { 
       ValidationResult result = rule.Validate(parent.GetValue(entry.Property), null); 
       if (!result.IsValid) 
       { 
        //BindingExpression expression = BindingOperations.GetBindingExpression(parent, entry.Property); 
        //System.Windows.Controls.Validation.MarkInvalid(expression, new ValidationError(rule, expression, result.ErrorContent, null)); 
        //valid = false; 
        return false; 
       } 
      } 
     } 
    } 

    // Validate all the bindings on the children 
    for (int i = 0; i != VisualTreeHelper.GetChildrenCount(parent); ++i) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
     if (!IsValid(child)) 
     { 
      //valid = false; 
      return false; 
     } 
    } 

    //return valid; 
    return true; 
} 
+0

这就是我一直在寻找。我唯一希望的另一件事是一种绑定结果的方法。 – Eric

0

我不知道为什么,slugter的回答,我没有工作(LocalValueEnumerator返回一些特性,但绝不是绑定的,如Text)。

我设法得到它与此代码(来自this answer派生)工作:

public static bool IsValid(DependencyObject obj) 
{ 
    // The dependency object is valid if it has no errors, 
    //and all of its children (that are dependency objects) are error-free. 
    return !Validation.GetHasError(obj) && 
     GetVisualTreeChildren(obj) 
     .OfType<DependencyObject>() 
     .All(child => IsValid(child)); 
} 

//VisualTreeHelper don't have a method to get all the children of a visual object 
private static IEnumerable GetVisualTreeChildren(DependencyObject parent) 
{ 
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
     yield return VisualTreeHelper.GetChild(parent, i); 
} 
相关问题