我想实现一些事情,当用户输入4个字符时,应该在文本中添加连字符,然后再次用户输入4个字符,然后再次在网页上自动添加。
注意
“我希望在用户在文本框中输入时(而不是在文本框失去焦点后)实现此行为,因为后者很容易实现”
使用MVVM模型,因此Dialog后面的代码应为空
答案 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>