Я сделал небольшое изменение / улучшение класса поведения водяных знаков Йохана, потому что он не учитывает изменения текстового поля из-за привязки.(то есть, допустим, у вас было:
<TextBox Text="{Binding AccountNumber,Mode=TwoWay}">
<i:Interaction.Behaviors>
<Behaviors:Placeholder Text="Enter Account #..." Foreground="Gray" />
</i:Interaction.Behaviors>
</TextBox>
А затем в вашей модели представления:
public string AccountNumber
{
get { return _accountNumber; }
set { _accountNumber = value;
RaisePropertyChanged("AccountNumber");
}
}
Теперь поведение обновляет водяной знак, если вы делаете что-то вроде "AccountNumber = string.Empty"где-то в вашем коде:
public class Placeholder : Behavior<TextBox>
{
private bool _hasPlaceholder;
private Brush _textBoxForeground;
public String Text { get; set; }
public Brush Foreground { get; set; }
protected override void OnAttached()
{
_textBoxForeground = AssociatedObject.Foreground;
base.OnAttached();
if (Text != null)
SetPlaceholderText();
AssociatedObject.GotFocus += GotFocus;
AssociatedObject.LostFocus += LostFocus;
AssociatedObject.TextChanged += TextChanged;
}
private void TextChanged(object sender,
TextChangedEventArgs textChangedEventArgs)
{
if (string.IsNullOrWhiteSpace(AssociatedObject.Text) &&
FocusManager.GetFocusedElement() != AssociatedObject)
{
if (Text != null)
SetPlaceholderText();
}
}
private void LostFocus(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(AssociatedObject.Text))
{
if (Text != null)
SetPlaceholderText();
}
}
private void GotFocus(object sender, RoutedEventArgs e)
{
if (_hasPlaceholder)
RemovePlaceholderText();
}
private void RemovePlaceholderText()
{
AssociatedObject.Foreground = _textBoxForeground;
AssociatedObject.Text = "";
_hasPlaceholder = false;
}
private void SetPlaceholderText()
{
AssociatedObject.Foreground = Foreground;
AssociatedObject.Text = Text;
_hasPlaceholder = true;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.GotFocus -= GotFocus;
AssociatedObject.LostFocus -= LostFocus;
}
}