首页 新闻 会员 周边 捐助

[WPF]TextBox的Text与显示值不一致的恐怖问题

0
[已关闭问题] 关闭于 2009-12-31 11:04

问题描述:
将一个 textBox 与自定义类中一个整型属性 Intx 双向绑定,属性中写了限制大小的逻辑

private ing _intx;
public int Intx()
{get{return _intx;}
  set
  {
    _intx = value;
    if(_intx<0)_intx = 0;
    if(_intx>100)_intx = 100;
  }
}

为了让文本框的内容与数据同步,在 textBox.TextChanged 事件中加入了 textBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();
现在我打算实现方便的改变数值的功能,所以处理了 textBox.PreviewKeyDown 事件,加入了如下代码

if(e.Key==Key.Down)textBox.Text = (Val(textBox.Text) - 1).ToString;
if(e.Key==Key.Up)textBox.Text = (Val(textBox.Text) + 1).ToString;

调试之,发现恐怖现象:当 textBox.Text 为0时,按向下方向键,显示值变成了-1;对于任意初始值,持续按住向下方向键,显示值最后也停在-1。然而无论是断点调试还是 Console.WriteLine() 什么的,textBox.Text 的值竟然都是0!
按住向上方向键,不出所料的最后显示101,而 textBox.Text 的值也是100!
求解……(绑定时没有设置Converter)

孔雀的主页 孔雀 | 初学一级 | 园豆:49
提问于:2009-12-17 15:37
< >
分享
所有回答(1)
0

textbox引发后台Intx的set的事件是TextBox的lostFocus事件,虽然说,调用textBox.GetBindingExpression(TextBox.TextProperty).UpdateTarget();这个,只是强制前台再次调用Intx的get.

我照着您的代码写了下,如果初始值为0,则textbox显示的只会是-1,与1。

反正,断点进不了

 set
  {
    _intx = value;
    if(_intx<0)_intx = 0;
    if(_intx>100)_intx = 100;
  }

颜昌钢 | 园豆:150 (初学一级) | 2009-12-17 17:34
public partial class Window1 : Window { AA a = new AA(); public Window1() { InitializeComponent(); this.textBox1.DataContext = a; } private void textBox1_TextChanged(object sender, TextChangedEventArgs e) { a.Intx = Convert.ToInt32(textBox1.Text); // textBox1.GetBindingExpression(TextBox.TextProperty).UpdateTarget(); } private void textBox1_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Down) a.Intx = Convert.ToInt32(textBox1.Text) - 1; //textBox1.Text = (Convert.ToInt32(textBox1.Text) - 1).ToString(); if (e.Key == Key.Up) a.Intx = Convert.ToInt32(textBox1.Text) + 1;//textBox1.Text = (Convert.ToInt32(textBox1.Text) + 1).ToString(); } } public class AA:INotifyPropertyChanged { private int _intx = 10; public int Intx { get { return _intx; } set { _intx = value; if (_intx < 0) _intx = 0; if (_intx > 100) _intx = 100; OnPropertyChanged("Intx"); } } #region INotifyPropertyChanged 成员 private PropertyChangedEventHandler PropertyChangedEventHandler; public event PropertyChangedEventHandler PropertyChanged { add { PropertyChangedEventHandler += value; } remove { PropertyChangedEventHandler -= value; } } protected void OnPropertyChanged(string propertyName) { if (PropertyChangedEventHandler != null) { PropertyChangedEventHandler(this, new PropertyChangedEventArgs(propertyName)); } } #endregion }
支持(0) 反对(0) 颜昌钢 | 园豆:150 (初学一级) | 2009-12-17 17:45
@颜昌钢:这个是我后面改了后的,但是,最后得值只能是0到100,
支持(0) 反对(0) 颜昌钢 | 园豆:150 (初学一级) | 2009-12-17 17:46
您的结果正确的代码与我出问题的代码区别在于,出问题的代码在事件处理程序中操作的是 textBox.Text,而结果正确的代码操作的是 a.Intx。但使用数据绑定的目的就是数据与界面的解耦,所以我现在需要寻求在保持操作 textBox.Text 的前提下解决这个问题,另外控件 Text 属性竟然能与控件显示出来的内容不一致,这个恐怖的事情也要找到原因。
支持(0) 反对(0) 孔雀 | 园豆:49 (初学一级) | 2009-12-18 17:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册