0

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

  1. 当我离开文本框时,将数据绑定到文本框更新。这到底是什么事件?失去焦点?
  2. 在后面的代码中使用现在更改的数据时,它似乎仍然使用旧数据。为什么会这样?第3点可能是原因吗?
  3. 在文本框更新后,我进行了测试并将 datacontext 设置为空,并将 datacontext 重新设置为同一个源。显示的值是我编辑它们之前的值。为什么他们编辑后显示,但重新绑定后恢复到旧值?
  4. 第二次更改值后,后面的代码似乎使用了我第一次更改后的数据。像第 3 点那样重新绑定会导致相同的结果(第一次更改后的值,第二次更改被忽略)。似乎后面的代码总是落后一个更新,我可以改变这个吗?

任何人都能够解释为什么会发生这种情况?

期望的行为:

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

为便于理解,附上一张三屏图片和相关代码示例。

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

1 回答 1

0

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

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

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

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

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

于 2013-11-15T00:47:55.013 回答