Подтвердить что ты не робот

Доступ к правилам проверки правил WPF из кода

XAML:

  <TextBox Name="textboxMin">
      <TextBox.Text>
          <Binding Path="Max">
              <Binding.ValidationRules>
                  <local:IntValidator/>
              </Binding.ValidationRules>
          </Binding>
      </TextBox.Text>
  </TextBox>

код:

void buttonOK_Click(object sender, RoutedEventArgs e)
{
    // I need to know here whether textboxMin validation is OK
    // textboxMin. ???

    // I need to write something like:
    // if ( textboxMin.Validation.HasErrors )
    //     return;
}

Было бы неплохо также знать, как отключить кнопку OK, если хотя бы один из элементов управления диалога не проходит проверку - в XAML, используя привязку. Имея этот путь, мне не нужно проверять состояние проверки в коде.

4b9b3361

Ответ 1

Validation.HasError - это вложенное свойство, поэтому вы можете проверить его для textboxMin как это

void buttonOK_Click(object sender, RoutedEventArgs e)
{
    if (Validation.GetHasError(textboxMin) == true)
         return;
}

Чтобы запустить все ValidationRules для TextProperty в коде позади, вы можете получить BindingExpression и вызвать UpdateSource

BindingExpression be = textboxMin.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();

Обновить

Для достижения привязки для отмены этой кнопки потребуется несколько шагов, если произойдет какая-либо проверка.

Сначала убедитесь, что все привязки добавлены NotifyOnValidationError = "True". Пример

<TextBox Name="textboxMin">
    <TextBox.Text>
        <Binding Path="Max" NotifyOnValidationError="True">
            <Binding.ValidationRules>
                <local:IntValidator/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Затем мы подключаем EventHandler к событию Validation.Error в окне.

<Window ...
        Validation.Error="Window_Error">

И в коде позади мы добавляем и удаляем ошибки проверки в наблюдаемом сборке, когда они приходят и уходят

public ObservableCollection<ValidationError> ValidationErrors { get; private set; } 
private void Window_Error(object sender, ValidationErrorEventArgs e)
{
    if (e.Action == ValidationErrorEventAction.Added)
    {
        ValidationErrors.Add(e.Error);
    }
    else
    {
        ValidationErrors.Remove(e.Error);
    }
}

И тогда мы можем привязать IsEnabled к Button к ValidationErrors.Count, как это.

<Button ...>
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ValidationErrors.Count}" Value="0">
                    <Setter Property="IsEnabled" Value="True"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

Ответ 2

вам нужно получить привязку сначала, прежде чем вы получите правила

    Binding b=  BindingOperations.GetBinding(textboxMin,TextBox.TextProperty);
    b.ValidationRules

else вы можете иметь BindingExpression и проверить свойство HasError

 BindingExpression be1 = BindingOperations.GetBindingExpression (textboxMin,TextBox.TextProperty);

be1.HasError