недвижимости: мы должны считать символы в строке не включая дефис индекса Caret наклоняет быть установлен здесь, потому что OnPropertyChanged
это не вызывается еще, так что TextBox.Text
стил содержит старое значение, и вы не можете установить значение, которое больше, чем длина текста:
private string _serial;
public string Serial
{
get { return _serial; }
set
{
if (_serial != value)
{
_serial = value;
int res = 0;
int hyphensCount = _serial.Count(c => c.Equals('-'));
Math.DivRem(_serial.Length - hyphensCount, 4, out res);
if (res == 0)
_serial = string.Format("{0}-", _serial);
OnPropertyChanged("Serial");
}
}
}
Поведение - регистр в TextChanged
событий и переместить курсор в конец текста:
public class MoveCaretToEndBehavior: Behavior<TextBox>
{
protected override void OnAttached()
{
AssociatedObject.TextChanged += new TextChangedEventHandler(AssociatedObject_TextChanged);
}
void AssociatedObject_TextChanged(object sender, TextChangedEventArgs e)
{
AssociatedObject.CaretIndex = AssociatedObject.Text.Length;
}
}
TextBox + Поведение
<TextBox Text="{Binding Serial,UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Behaviors>
<local:MoveCaretToEndBehavior />
</i:Interaction.Behaviors>
</TextBox>
Попробуйте использовать MaskedTextBox: http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox –
Daniel Hilgarth, На самом деле, я хочу использовать только текстовое поле с открытым текстом –
В чем причина этого? –