0

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

笔记

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

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

4

2 回答 2

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>
于 2013-05-07T11:16:57.173 回答
1

属性定义: 我们应该计算字符串中不包括连字符的字符 插入索引不能在这里设置,因为OnPropertyChanged还没有被调用,所以TextBox.Textstil 包含旧值,你不能设置一个大于文本长度的值:

 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 Text="{Binding Serial,UpdateSourceTrigger=PropertyChanged}">
        <i:Interaction.Behaviors>
            <local:MoveCaretToEndBehavior />
        </i:Interaction.Behaviors>


</TextBox>
于 2013-05-07T15:44:35.817 回答