在TextBox中每4个字符后自动插入连字符

时间:2013-05-07 10:51:42

标签: wpf wpf-controls wpfdatagrid wpftoolkit wpf-4.0

我想实现一些事情,当用户输入4个字符时,应该在文本中添加连字符,然后再次用户输入4个字符,然后再次在网页上自动添加。

注意

“我希望在用户在文本框中输入时(而不是在文本框失去焦点后)实现此行为,因为后者很容易实现”

使用MVVM模型,因此Dialog后面的代码应为空

2 个答案:

答案 0 :(得分:2)

您可以使用viewmodel中的属性执行此操作,如下所示。但是,您会发现文本框插入符号中的光标不会移动到最后一个索引,并且由于caretindex不可绑定,因此您需要创建一个附加属性以绑定到索引。

        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>

答案 1 :(得分:1)

属性定义:  我们应该计算字符串中不包括连字符的字符  由于OnPropertyChanged尚未被调用,因此不能在此处设置插入符号索引,因此TextBox.Text stil包含旧值,并且您无法设置大于文本长度的值:

 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>