Как я могу пропустить проверку для элементов, которые отключены? - PullRequest
3 голосов
/ 14 декабря 2009

Я довольно новичок в 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 через Binding в XAML, чтобы привязать к одному и тому же значению для IsEnabled и NotifyOnValidationError элемента, но я не могу этого сделать, поскольку это не DependencyProperty.

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


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

Но это также не помогает, поскольку ElementIsEnabled не является свойством DependencyProperty для объекта DependencyObject.

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

1 Ответ

5 голосов
/ 14 июня 2011

В .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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...