Как показать сообщение об ошибке, используя IValidatableObject в WPF? - PullRequest
1 голос
/ 30 мая 2019

Я использую IValidatableObject для проверки моего шаблона в wpf.Однако сообщение об ошибке не возвращается в интерфейс.Однако стоит уточнить, что валидация работает.Единственная проблема заключается в том, что сообщение не отображается в интерфейсе.

public string Host
{
   get => _host;
   set
   {
       _host = value;
       OnPropertyChanged();
    }
}

public string Port
{
   get => _port;
   set
   {
     _port = value;
     OnPropertyChanged();
   }
}

public string User
{
    get => _user;
    set
    {
      _user = value;
      OnPropertyChanged();
     }
}


public bool IsEmptyOrNull(string value) => string.IsNullOrWhiteSpace(value);

public IEnumerable<ValidationResult> Validate()
{
   var results = new List<ValidationResult>();
   var context = new ValidationContext(this);
   Validator.TryValidateObject(this, context, results, true);
   return results;
}

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
  if (IsEmptyOrNull(Host))
  {
      yield return new ValidationResult(Resources.EmptyOrNull, new[] { nameof(Host) });
  }
  if (IsEmptyOrNull(Port))
  {
      yield return new ValidationResult(Resources.EmptyOrNull, new[] { nameof(Port) });
  }
  if (IsEmptyOrNull(User))
  {
     yield return new ValidationResult(Resources.EmptyOrNull, new[] { nameof(User) });
  }
  if (IsEmptyOrNull(Password))
  {
     yield return new ValidationResult(Resources.EmptyOrNull, new[] { nameof(Password) });
  }
  if (IsEmptyOrNull(DataBase))
  {
      yield return new ValidationResult(Resources.EmptyOrNull, new[] { nameof(DataBase) });
  }
}

Здесь интерфейс XML

 <TextBox x:Name="HostTextBox" Text="{Binding AppSetting.Host,UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, ValidatesOnNotifyDataErrors=True}"  Validation.ErrorTemplate="{StaticResource ErrorTemplate}" HorizontalAlignment="Left" Width="200" Margin="5,0,0,0" BorderBrush="#FF5774CB" mah:TextBoxHelper.Watermark="Localhost" TabIndex="1" FontSize="14"/>
<ControlTemplate x:Key="ErrorTemplate">
     <Border BorderBrush="OrangeRed" BorderThickness="2">
         <Grid>
            <AdornedElementPlaceholder/>
            <TextBlock Text="{Binding [0].ErrorContent}" Foreground="OrangeRed" VerticalAlignment="Center" HorizontalAlignment="Right"
Margin="0,0,4,0"/>
        </Grid>
    </Border>
</ControlTemplate>

Как отобразить сообщение об ошибке на интерфейсе из этогопроверка

1 Ответ

1 голос
/ 31 мая 2019

Ваша проблема в том, что IValidateObject ТОЛЬКО возвращает результаты проверки.

WPF не заботится о них.

Вам необходимо реализовать inotifydataerrorinfo или другой интерфейс, который понимает WPF, и использовать эти результаты для этого.

Вы можете адаптировать код, который я использую в этом:

https://gallery.technet.microsoft.com/scriptcenter/WPF-Entity-Framework-MVVM-78cdc204

Посмотрите на код в BaseEntity.

...