Я использую 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>
Как отобразить сообщение об ошибке на интерфейсе после этой проверки?
Ничего не появляется, ни полоса оранжево-красная, ни сообщение.
Ваша проблема в том, что IValidateObject ТОЛЬКО возвращает эти результаты проверки.
WPF не заботится о них.
Вам нужно реализовать inotifydataerrorinfo или другой интерфейс, который понимает WPF, и использовать в нем эти результаты.
Вы можете адаптировать код, который я использую в этом:
https://gallery.technet.microsoft.com/scriptcenter/WPF-Entity-Framework-MVVM-78cdc204
Взгляните на код в BaseEntity.
Тогда элемент управления определенно загорается оранжево-красной рамкой? Что произойдет, если вы поместите украшенный элемент-заполнитель и текстовый блок ошибки в док-панель вместо сетки?