Вот решение только для XAML, использующее довольно простые «механизмы».
Я ни в коем случае не эксперт по XAML. Вероятно, есть лучшие и / или более элегантные способы сделать это, но это то, что я получил, попробовав и объединив вещи, которые я нашел на этом сайте.
Я думал, что это довольно прямо, явно, и это может быть полезно для некоторых ...
Не стесняйтесь комментировать любые вопросы или вещи, которые можно сделать лучше.
<Grid>
<TextBox Name="TheField"
HorizontalAlignment="Center"
VerticalAlignment="Center"
MinWidth="170"
Background="Transparent"
Foreground="Black"
Margin="5,2,5,2"
BorderThickness="0"
FontSize="10"
Text="{Binding THE_BOUNDED_PROPERTY, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox HorizontalAlignment="Center"
VerticalAlignment="Center"
MinWidth="170"
Foreground="#FF808080"
Margin="5,2,5,2"
IsHitTestVisible="False"
BorderThickness="0"
FontStyle="Italic"
FontSize="10"
Text="THE DEFAULT TEXT">
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=TheField, Path=IsKeyboardFocusWithin}" Value="False"/>
<Condition Binding="{Binding ElementName=TheField, Path=Text.IsEmpty}" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger>
<DataTrigger Binding="{Binding ElementName=TheField, Path=IsKeyboardFocusWithin}" Value="True">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=TheField, Path=Text.IsEmpty}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</Grid>