在我的 VS 2012 WPF 项目中,我有一个名为的自定义文本框类TextBoxDX
,它添加了一项AutoSelect
功能。没问题。我有另一个基于TextBoxDX
IntBox 的类,它只允许整数。这就是我们的故事开始的地方。这两个类都用于绑定情况,如下所示:
<local:TextBoxDX Grid.Row="0" Grid.Column="1" x:Name="txtBox_singlesName" Width="320" HorizontalAlignment="left" Text="{Binding SelectedItem.name, ElementName=listBoxSingles, Mode=OneWay}"/>
<local:IntBox x:Name="intBox_heightin" Width="60" AllowZeroValue="True" MaxLength="2" Text="{Binding SelectedItem.heightin, ElementName=listBoxSingles, Mode=OneWay}" MinVal="0" MaxVal="11"/>
可以肯定的是,除了绑定之外,大部分都是无关紧要的。两者都可以正常工作,因为它们会根据选择更改其文本ListBox
。但是在IntBox
课堂上,我不得不添加只允许整数的代码。为了做到这一点,我参加了课堂上的TextChanged
活动。IntBox
最终结果是这样的:
using System;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace Herculese
{
public class IntBox : TextBoxDX
{
//INIT PROPERTIES
private int _MaxVal = 0;
private int _MinVal = 0;
private bool _AllowZeroValue = false;
//INIT STRING TO KEEP TRACK OF TEXT BEFORE CHANGES
private string originalText;
public IntBox()
{
//ADD TO TEXTCHANGED HANDLER
TextChanged += new TextChangedEventHandler(My_OnTextChanged);
//STORE ORIGINAL TEXT
originalText = this.Text;
}
//EVENT HANDLER WHEN TEXT IS CHANGED
private void My_OnTextChanged(object sender, EventArgs e)
{
//IF THERE IS TEXT IN THE BOX,
MessageBox.Show("yee");
if (this.Text.Length > 0)
{
//REMOVE SPACES AND LEADING ZEROS FROM STRING
if (!_AllowZeroValue)
this.Text = this.Text.TrimStart('0');
this.Text = Regex.Replace(this.Text, @"\s+", "");
//IF VALUE ISN'T NUMERICAL OR NOTHING IS LEFT AFTER REMOVING ZEROS AND SPACES, CHANGE TEXT BACK TO ORIGINAL
Regex regex = new Regex("[^0-9]+");
if (regex.IsMatch(this.Text) || this.Text.Length < 1)
{
this.Text = originalText;
System.Media.SystemSounds.Beep.Play();
}
//IF VALUE IS NUMERICAL,
else
{
//MAKE SURE VALUE IS WITHIN ACCEPTED RANGE. IF NOT, CHANGE IT TO HIGHEST/LOWEST AVAILABLE RESPECTIVELY
int intText;
intText = Convert.ToInt32(this.Text);
if (intText > _MaxVal)
{
this.Text = _MaxVal.ToString();
System.Media.SystemSounds.Beep.Play();
}
else if (intText < _MinVal)
{
this.Text = _MinVal.ToString();
System.Media.SystemSounds.Beep.Play();
}
//SUCCESS! UPDATE ORIGINAL TEXT WITH NEW VALID VALUE.
else originalText = this.Text;
}
}
}
//PROVIDE GET/SET PROPERTIES
public int MaxVal
{
get { return _MaxVal; }
set { _MaxVal = value; }
}
public int MinVal
{
get { return _MinVal; }
set { _MinVal = value; }
}
public bool AllowZeroValue
{
get { return _AllowZeroValue; }
set { _AllowZeroValue = value; }
}
}
}
如您所见,我TextChanged
在IntBox
. 狂野派对,你的名字。突然我意识到绑定 forIntBox
不再起作用了。我可以手动更改文本就好了。它只接受整数并且像魅力一样工作。但是更改ListBox
选择不再更新文本。如果我删除了 中的代码My_OnTextChanged
,则绑定再次起作用。我认为我的代码导致了问题。所以我今天带着全新的头脑回来,意识到一些奇怪的事情。
如果我删除其中的代码My_OnTextChanged
并将其替换为MessageBox
,则绑定有效并出现消息框。非常有意义,并进一步说明我的代码导致了问题。现在奇怪的是:如果我在代码之后将代码放回事件中MessageBox
,绑定再次被破坏并且MessageBox
从不显示意味着事件永远不会触发。我只能说...... HUUUUH?!我已经重新创建了几次,以确保我没有发疯。我能想到的唯一另一件事是与TextBoxDX
它继承的冲突,所以我让它直接继承TextBox
并得到相同的结果......有人知道这个吗?