我不明白以下关于数据绑定的 4 点。不确定我是否得到了意想不到的结果(代码后面的过时数据),或者这只是我误解事情如何工作的结果。
- 当我离开文本框时,绑定到文本框的数据会更新。什么事件到底是这样做的?失去焦点?
- 在代码隐藏中使用现在更改的数据时它似乎仍在使用旧数据。为什么会这样?能第3点是原因吗?
- 文本框更新后,我做了一个测试并设置了数据上下文一无所获,并收获了同样的祸害。价值观显示的是我编辑它们之前的值。为什么他们在编辑后出现,但是重新绑定后恢复为旧值?
- 第二次更改值后,似乎就像代码隐藏在我第一次更改后使用数据一样。重新绑定喜欢在第 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 的可能性,而不仅仅是在他完成后。更干净,更好看。