2009-12-14 60 views
3

我對WPF相當陌生。在我們當前的項目中,我們爲所有需要驗證的數據輸入字段添加了驗證規則。我們還複製了所有綁定及其驗證規則遞歸循環的代碼(也在此處以stackoverflow發佈),以便在保存數據之前知道所有數據是否有效。如何跳過已禁用元素的驗證?

這是我們的代碼,我認爲是要解決我們的問題的地方:

Public Function ValidateBindings(ByVal parent As DependencyObject) As Boolean 
    Dim valid As Boolean = True 
    Dim localValues As LocalValueEnumerator = parent.GetLocalValueEnumerator 

    While localValues.MoveNext 
    Dim entry As LocalValueEntry = localValues.Current 
    If BindingOperations.IsDataBound(parent, entry.Property) Then 
    Dim binding As Binding = BindingOperations.GetBinding(parent, entry.Property) 
    For Each rule In binding.ValidationRules 
    Dim result As ValidationResult = rule.Validate(parent.GetValue(entry.Property), Nothing) 
    If Not result.IsValid Then 
     Dim expression As BindingExpression = BindingOperations.GetBindingExpression(parent, entry.Property) 
     Validation.MarkInvalid(expression, New ValidationError(rule, expression, result.ErrorContent, Nothing)) 
     valid = False 
    End If 
    Next 
    End If 
    End While 

    For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(parent) - 1 
    Dim child As DependencyObject = VisualTreeHelper.GetChild(parent, i) 

    If Not ValidateBindings(child) Then 
    valid = False 
    End If 
    Next 

    Return valid 
End Function 

我試圖找出如何在parentIsEnabledProperty依賴屬性使用GetValue(),但我嘗試這樣遠未失敗。 任何人都可以幫助我解決這個問題或這不是正確的思維方式?

另外,我一直在玩弄把驗證錯誤綁定到「忽略任何內容」的想法 - 當禁用字段時,規則,但對我來說似乎更麻煩。

我試圖設置Binding.NotifyOnValidationError通過XAML綁定,綁定到爲同一值的元素的IsEnabledNotifyOnValidationError,但我不能這樣做,因爲它不是一個DependencyProperty。

另一件事我想是在驗證類添加屬性ElementIsEnabled,也能夠做到在XAML是這樣的:

 

    <Binding.ValidationRules> 
     <local:MustContainInteger ElementIsEnabled="{Binding SameBindingAsIsEnabled}" /> 
    </Binding.ValidationRules> 
 

但還是失敗,因爲ElementIsEnabled是不是在DependencyObject的一個DependencyProperty 。

無論如何,任何幫助將不勝感激。

回答

5

在.NET 4中,您現在就可以通過x:Reference得到的有效性規則裏面的元素的引用:

public class MustContainInteger : ValidationRule 
{ 
    public UIElement Element { get; set; } 

    // ... 
} 
<TextBox Name="testtb"> 
    <TextBox.Resources> 
     <!-- Definition in resources necessary because of cyclical dependency --> 
     <vr:MustContainInteger x:Key="Rule" Element="{x:Reference testtb}" /> 
    </TextBox.Resources> 
    <TextBox.Text> 
     <Binding Path="TestString"> 
      <Binding.ValidationRules> 
       <StaticResource ResourceKey="Rule" /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

當然,這可以讓你在Validate檢查Element.IsEnabled