Существует множество способов сделать это. Если вы собираетесь сделать это только один раз, самый простой способ - добавить TextBlock
к макету и использовать стиль, чтобы скрыть его, например ::
.
<StackPanel>
<TextBox Text="{Binding Text, Mode=TwoWay}">
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="BorderBrush" Value="Lightgray"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsValid}" Value="False">
<Setter Property="BorderBrush" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<TextBlock Text="This is the message displayed if IsValid is false.">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsValid}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
Если это то, что вы хотите повторить, вы захотите превратить это в шаблон или пользовательский элемент управления.
Также обратите внимание, что изменение видимости со свернутой на видимую изменит общую компоновку, что может привести к нежелательным эффектам. В зависимости от вашего дизайна вы можете сделать видимость по умолчанию скрытой.