关于数据绑定,我不理解以下4点。不确定我是否会得到意想不到的结果(代码中的过时数据),或者这只是因为我误解了事情的运作方式。
任何人都能解释为什么会这样吗?
所需行为
我希望人们在编辑住房计数时更新。在飞行中优先,但失去焦点后很好。当失去焦点时,岛屿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];
}
答案 0 :(得分:0)
我遇到的问题是在这种情况下事件被触发的顺序。或者更准确:一次发生两件事。
TextBox使用“LostFocus”-Event来更新属性,与我用来更新其他TextBox控件的事件相同。由于两者都立即使用“过时”数据进行计算,因此看起来我的UI在一方面落后了一步。
要解决这个问题,我只需要改变我的TextBox更新属性的方式,通过在XAML中执行我的绑定:
Text="{Binding intBauer, UpdateSourceTrigger=PropertyChanged}"
现在,属性会立即更新,在“LostFocus”之前,甚至在“TextChanged”之前。 这也可以在用户更改值时更新UI,而不仅仅是在完成后更新UI。更清洁,更好看。