#c# #wpf #validation #mvvm #textbox
#c# #wpf #проверка #mvvm #текстовое поле
Вопрос:
Не хочу, чтобы сообщение об ошибке отображалось при запуске / при открытии вкладки.
Проверка осуществляется с использованием IDataErrorInfo (для виртуальной машины), определяется ErrorTemplate (XAML), который может выдавать сообщение об ошибке рядом с текстовым полем.
VM:(extended IDataErrorInfo)
public string this[string propertyName]
{
get
{
string validationResult = null;
switch (propertyName)
{
case "ProjectManager":
validationResult = ValidateManagerName();
break;
}
return validationResu<
}
}
public string ValidateManagerName()
{
if (string.IsNullOrEmpty(this.ProjectManager))
{
return "Manager name is mandatory!";
}
else
return string.Empty;
}
XAML.cs
save_option_summ()
{
BindingExpression be3 = managername.GetBindingExpression(TextBox.TextProperty);
be3.UpdateSource();
}
<StackPanel.Resources>
<ControlTemplate x:Key="ErrorTemplate">
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Right" Foreground="Blue" FontSize="13" Text="{Binding ElementName=adorned,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" >
</TextBlock>
<Border BorderBrush="Red" BorderThickness="2">
<AdornedElementPlaceholder x:Name="adorned"/>
</Border>
</DockPanel>
</ControlTemplate>
</StackPanel.Resources>
<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
<Label Content="Project Manager" FontSize="14" Margin="100,0,0,0" Width="150" FontFamily="Calibri"></Label>
<TextBox Height="auto" Width="300" Background="White" Margin="100,0,0,0" Validation.ErrorTemplate = "{StaticResource ResourceKey=ErrorTemplate}" Name="managername" Text="{Binding ProjectManager,Mode=TwoWay,UpdateSourceTrigger=LostFocus,ValidatesOnDataErrors=True}" TextChanged="TextChanged" FontFamily="Calibri" FontSize="14"/>
</StackPanel>
Ответ №1:
Вам следует изменить стиль текстового поля, чтобы он показывал, что не так со свойством. Вот простой пример, который показывает ошибку в виде всплывающей подсказки:
<TextBox>
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors).[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
Комментарии:
1. Спасибо за ответ. Это помогло мне отобразить сообщение об ошибке во всплывающей подсказке. На самом деле я возвращал сообщение об ошибке, когда текстовое поле пустое. Следовательно, текстовое поле всегда было красным. Теперь возвращаем ‘string.empty’.
2. Рад, что это помогло, пожалуйста, отметьте правильный ответ, если это решило вашу проблему
Ответ №2:
Итак, вместе с ответом Шивама Суда (который помогает отобразить ошибку во всплывающей подсказке).
В коде, показанном выше (вопрос),
public string ValidateManagerName()
{
if (string.IsNullOrEmpty(this.ProjectManager))
{
return "string.Empty";
}
//Other conditions can be written like alphanumeric check
else
return string.Empty;
}
Не возвращайте ничего при проверке null (первое условие), чтобы в текстовом поле не всегда отображалось сообщение об ошибке.