有没有方法可以确定ItemsControl是否有任何带有验证错误的子控件?我想将此值(布尔值)绑定到Button上的IsEnabled属性。WPF ItemsControl ItemTemplate Validation
1
A
回答
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
我不知道为什么,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);
}
相关问题
- 1. WPF ItemsControl ItemTemplate与GroupStyle的边框
- 2. ItemsControl ItemTemplate Binding
- 3. 如何操作ItemsControl ItemTemplate
- 4. WPF - ItemsControl - 我该如何找到ItemTemplate中的“CheckBox”项目?
- 5. WPF Textfield Validation
- 6. Wpf ItemTemplate CurrentItem
- 7. ItemsControl和复杂ItemTemplate的性能问题
- 8. 为什么ItemsControl不使用我的ItemTemplate?
- 9. 在XAML中使用ListView ItemTemplate内的ItemsControl
- 10. 意外行为ItemsControl的模板/ ItemTemplate中
- 11. 的Silverlight ItemsControl的 - 改变的ItemTemplate
- 12. 设置ItemsControl驻留在UserControl中的ItemTemplate
- 13. WPF HierarchicalDataTemplate&ItemsControl
- 14. WPF ItemsControl弹出ButtonContent的FontSize
- 15. WPF ItemsControl:更改ItemsControl ItemsControl从当前选择的另一个ItemsControl
- 16. WPF - 为ItemsPresenter实现ItemTemplate?
- 17. WPF Datatemplating一个ItemsControl
- 18. ItemsControl无背景WPF
- 19. WPF Tab Into Databound ItemsControl
- 20. WPF中的FlowLayout ItemsControl
- 21. WPF ItemsControl不刷新
- 22. 如何在ItemsControl中使用TemplatedControl的样式ItemTemplate
- 23. WPF ItemsControl绑定和项目顺序
- 24. WPF工具包autocompletebox的ItemTemplate
- 25. WPF的ListView的ItemTemplate质疑
- 26. 打印WPF ItemsControl跨多页
- 27. WPF的ItemsControl的datacontext排序
- 28. 寻找在WPF itemscontrol控件
- 29. WPF ItemsControl的结合问题
- 30. WPF OnPropertyChanged的内部ItemsControl的
这就是我一直在寻找。我唯一希望的另一件事是一种绑定结果的方法。 – Eric