我想在我的WPF應用程序中使用Detecting WPF Validation Errors中的解決方案執行驗證。GetLocalValueEnumerator()不返回所有屬性
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;
}
}
}
}
// 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 valid;
}
我遇到的問題是,當我單步執行TextBox的代碼時,我沒有得到Text屬性。我得到的唯一屬性是「PageHeight」,「Instance」和「UndoManagerInstance」。因此,我無法驗證TextBox上綁定的規則。
有沒有人有任何想法,爲什麼我不會得到正確的屬性?有沒有另一種方法來強制WPF中的控件有效?我一直無法找到任何有此問題的人。
更新: 我想驗證的TextBoxes是在一個DataTemplate中。我發現,如果我複製其中一個TextBox並將其直接放置在窗口中,我就能夠獲取數據。使用Woodstock,我發現模板中的TextBoxes的數據源是「ParentTemplate」,但是它是模板外TextBox的「Local」。
所以,現在的問題是,我怎樣才能得到控件的DependencyProperties一個DataTemplate?