更改set访问器中的文本框绑定文本值

时间:2010-02-06 15:36:43

标签: wpf data-binding textbox

我希望有人可以帮我这个,我怀疑我做的事情很愚蠢。我绑定了TextBox,以便Text绑定到InputValue。基本上,当文本值改变时,我有一个方法(Inches.Parse),它检查值并返回格式良好的字符串。

如果解析没有错误,我希望文本框具有名为“result”的格式良好的字符串。但是,TextBox不会显示新文字?任何帮助将不胜感激。

public string InputValue 
{
    get
    {
        return _inputValue;
    }
    set
    {
        if (_inputValue != value)
        {                                        
            bool error;
            string result = Inches.Parse(value, 64, out error);                    

            if (error != IsValid)
            {
                IsValid = error;
            }
            if (!error)
            {
                _inputValue = result;
            }
            else
            {
                _inputValue = value;
            }

            NotifyPropertyChanged("InputValue");
        }
    }
}

2 个答案:

答案 0 :(得分:3)

这是一个明显可以在dot net 4.0中修复的错误/问题

基本上问题是如果绑定设置了一个属性,它在setter期间不会查找NotifyPropertyChanged。您可以通过使用调度程序在主ui线程上调用NotifyPropertyChanged来解决此问题。这样就完成了

Application.Current.Dispatcher.BeginInvoke((Action)delegate { NotifyPropertyChanged("InputValue"); });

把它放在你的二传手中,你应该没问题。

答案 1 :(得分:1)

问题似乎是TextBox在更新它自己绑定的源属性期间不会更新显示的值。

解决方法可能是设置此绑定表达式

{Binding Path=InputValue, Mode=TwoWay,UpdateSourceTrigger=Explicit}

请注意UpdateSourceTrigger=Explicit这表示您将手动更新来源

然后您将处理程序添加到TextBox LostFocus事件(因此我们确定用户已完成编辑)

textBox1.LostFocus +=
(s, e) =>
  {
    var text = textBox1.Text;
    [DataSource].InputValue = text;
  };

因此当TextBox失去焦点时,数据源中的值将被更新和格式化,然后TextBox将被反弹。

希望这会对你有所帮助。