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



我不明白以下关于数据绑定的 4 点。不确定我是否得到了意想不到的结果(代码后面的过时数据),或者这只是我误解事情如何工作的结果。

  1. 当我离开文本框时,绑定到文本框的数据会更新。什么事件到底是这样做的?失去焦点?
  2. 在代码隐藏中使用现在更改的数据时它似乎仍在使用旧数据。为什么会这样?能第3点是原因吗?
  3. 文本框更新后,我做了一个测试并设置了数据上下文一无所获,并收获了同样的祸害。价值观显示的是我编辑它们之前的值。为什么他们在编辑后出现,但是重新绑定后恢复为旧值?
  4. 第二次更改值后,似乎就像代码隐藏在我第一次更改后使用数据一样。重新绑定喜欢在第 3 点中,导致相同的结果(第一次更改后的值,忽略第二个更改)。似乎后面的代码总是落后一个更新,我可以改变吗?

有人能够解释为什么会发生这种情况吗?

期望的行为:

我希望在编辑住房计数时更新人口计数。最好在飞行中,但在失去焦点后没关系。失去焦点时,岛 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-Event

    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];
    }

我面临的问题是在这种情况下触发事件的顺序。或者更准确地说:两件事同时发生。

TextBox

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

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

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

现在,该属性会立即更新,在"LostFocus"之前,甚至在"TextChanged"之前。这也打开了在用户更改值时更新 UI 的可能性,而不仅仅是在他完成后。更干净,更好看。

最新更新