Чтобы иметь возможность предоставлять значимые сообщения пользователю, лучше всего задать свойства вашей ViewModel, которые должны быть связаны с TextBox типа string, и реализовать IDataErrorInfo
в вашей ViewModel.
Inмои проекты, я использую это так.Я создал интерфейс IValidateable
(пожалуйста, прости имя ...), который реализует IDataErrorInfo.Мой ViewModel реализует этот интерфейс:
public interface IValidateable : IDataErrorInfo
{
ObservableCollection<Tuple<string, ValidationError>> InvalidProperties
{ get; }
bool IsValid { get; }
}
Все мои текстовые поля используют следующий стиль:
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError"
Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="90*" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<Border BorderBrush="Red"
BorderThickness="1"
CornerRadius="2.75"
Grid.Column="0">
<AdornedElementPlaceholder Grid.Column="0" />
</Border>
<TextBlock Foreground="Red"
Grid.Column="1"
Margin="0"
FontSize="12"
VerticalAlignment="Center"
HorizontalAlignment="Left">
*
</TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Это покажет подсказку, если введенное значение не соответствует моим правилам.
Кроме того, я создал небольшой механизм проверки, который позволяет назначать правила свойствам модели представления и базовому классу, который автоматически проверяет значение свойства при установке нового значения.
Элементы интерфейсаIValidateable
используются для отображения значимого сообщения об ошибке пользователю, когда он пытается сохранить недопустимый объект.