使用过时值进行数据绑定更新

时间:2013-11-14 17:15:17

标签: c# wpf data-binding

关于数据绑定,我不理解以下4点。不确定我是否会得到意想不到的结果(代码中的过时数据),或者这只是因为我误解了事情的运作方式。

  1. 当我离开文本框时,将数据绑定到文本框会更新。什么事 这确实是这样的吗?引发LostFocus?
  2. 在代码中使用现在更改的数据时 它似乎仍然使用OLD数据。为什么会这样?可以 第3点是什么原因?
  3. 在文本框更新后,我进行了测试并设置了datacontext 什么都没有,并将datacontext收入同一个scource。价值 显示的是我编辑它们之前的值。他们为什么在编辑后出现,但是 重新绑定后返回旧值?
  4. 似乎第二次更改值后 像我后面的代码在第一次更改后使用数据。像重新绑定一样 在第3点导致相同的结果(第一次更改后的值, 第二次改变被忽略)。似乎后面的代码总是一个更新,我可以改变它吗?
  5. 任何人都能解释为什么会这样吗?

    所需行为

    我希望人们在编辑住房计数时更新。在飞行中优先,但失去焦点后很好。当失去焦点时,岛屿ID 0的值应该是正确的,而不是过时的值。

    为了便于理解,带有3个屏幕和相关代码示例的图片。

    http://www.mathematik-lehramtsstudium.de/BindingExample.jpg

    我的班级:

    //class for isles
    public class isle : INotifyPropertyChanged
    {        
        //Dummyvariables,...
        private int _intBauer;
        private int _intBauerBev;        
    
        //variables
        public int intIsleID { set; get; }      //isle ID
        public string strName { set; get; }     //isle name
    
        public int intBauer                     //housing count
        {       
          set 
          { 
             this._intBauer = value; 
             NotifyPropertyChanged("intBauer"); NotifyPropertyChanged("intBauerBev"); 
          } 
          get 
          { 
             return _intBauer; 
          } 
        }       
        public int intBauerBev                  //each house hosts 8 people
        { 
            set { this._intBauerBev = value;} 
            get { return intBauer * 8; } 
        }       
    
        protected void NotifyPropertyChanged(String propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
    }
    

    LostFocus - 用于更新页面右侧的事件

        private void textboxHäuser_LostFocus(object sender, RoutedEventArgs e)
        {           
            //Gesamtzahl neu berechnen
            listIsles[0].intBauer = 0;
            for (int i = 1; i < 10; i++)
            {
                listIsles[0].intBauer += listIsles[i].intBauer;
            }
            //hard refresh DataContext, since it does not seem to update itself
            //leaving these two lines out of my code changes nothing tho, as expected 
            gridInfoGesamt.DataContext = "";
            gridInfoGesamt.DataContext = listIsles[0];
        }
    

1 个答案:

答案 0 :(得分:0)

我遇到的问题是在这种情况下事件被触发的顺序。或者更准确:一次发生两件事。

TextBox使用“LostFocus”-Event来更新属性,与我用来更新其他TextBox控件的事件相同。由于两者都立即使用“过时”数据进行计算,因此看起来我的UI在一方面落后了一步。

要解决这个问题,我只需要改变我的TextBox更新属性的方式,通过在XAML中执行我的绑定:

Text="{Binding intBauer, UpdateSourceTrigger=PropertyChanged}"

现在,属性会立即更新,在“LostFocus”之前,甚至在“TextChanged”之前。 这也可以在用户更改值时更新UI,而不仅仅是在完成后更新UI。更清洁,更好看。