2009-12-14 2 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 

Я пытался выяснить, как использовать GetValue() на имущество в IsEnabledProperty зависимости от parent, но мои попытки так далеко не удалось. Может ли кто-нибудь помочь мне с этим или нет неправильным способом мышления для решения этой проблемы?

В качестве альтернативы, я играл с мыслью о привязке ошибки проверки к «игнорировать любой контент», когда поле отключено, но для меня это больше беспокоит.

Я попытался установить Binding.NotifyOnValidationError через связывание в XAML, привязать к одному и тому же значению для элемента IsEnabled и NotifyOnValidationError, но я не могу этого сделать, так как это не является DependencyProperty.

Другая вещь, которую я попытался было добавить свойство ElementIsEnabled в классе валидации, не быть в состоянии сделать что-то подобное в XAML:

 

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

Но это также не так ElementIsEnabled не DependencyProperty на DependencyObject ,

В любом случае, любая помощь по этому вопросу будет принята с благодарностью.

ответ

5

В .NET 4 теперь вы можете получить ссылку на ваш элемент внутри ValidationRule через 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> 

Это, конечно, позволяет проверить Element.IsEnabled в Validate.

Смежные вопросы