2013-05-07 1 views
0

Я хочу реализовать что-то, что, когда пользователь вводит 4 символа, тогда в текст добавляется дефис, а затем снова вводится 4 символа, а затем снова автоматически добавляется hypen WPF.Вставьте дефис автоматически после каждых 4 символов в TextBox

Примечание

«Я хочу, чтобы реализовать такое поведение, когда пользователь вводит в текстовое поле (не после того, как текстовое поле потерял фокус) Beacause позже очень легко реализовать»

Использование MVVM модель, поэтому код за Диалогом должен быть пустым

+0

Попробуйте использовать MaskedTextBox: http://wpftoolkit.codeplex.com/wikipage?title=MaskedTextBox –

+0

Daniel Hilgarth, На самом деле, я хочу использовать только текстовое поле с открытым текстом –

+0

В чем причина этого? –

ответ

1

недвижимости: мы должны считать символы в строке не включая дефис индекса 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> 
2

Вы можете сделать это с помощью свойства в своей модели просмотра, как показано ниже. Однако вы обнаружите, что курсор в карете текстового поля не перемещается к последнему индексу, и поскольку каретинга не привязана, вам нужно создать прикрепленное свойство для привязки к индексу.

 private string _serial; 

     public string Serial 
     { 
      get { return _serial; } 
      set 
      { 
       if (_serial != value) 
       { 
        _serial = value; 
        int res = 0; 
        Math.DivRem(_serial.Length, 4, out res); 
        if (res == 0) 
         Serial = string.Format("{0}-", _serial); 
        CaretIndex = _serial.Lenght - 1; 
        RaisePropertyChanged("Serial"); 
       } 
      } 
     } 

Укажите код xaml, который вам нужен. Определение

<Window x:Name="root" x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="WpfApplication1" 
     Title="MainWindow" Height="350" Width="525"> 
    <TextBox 
     Text="{Binding ElementName=root, Path=Serial, UpdateSourceTrigger=PropertyChanged}" 
     local:TextIndexBinder.Index="{Binding ElementName=root, Path=Index}" 
     /> 
</Window> 
+0

. Часть setter свойства будет вызываться, когда я потеряю фокус из текстового поля, который я не хочу. Я хочу эффект, пока пользователь нажимает клавишу –

+0

Обратите внимание на UpdateSourceTrigger в привязке. Он немедленно обновляется. –