【问题标题】:Databinding updating with outdated values使用过时值更新数据绑定
【发布时间】:2013-11-14 17:15:16
【问题描述】:

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

  1. 当我离开文本框时,绑定到文本框的数据会更新。什么活动 究竟是这样做的?失去焦点?
  2. 在后面的代码中使用现在更改的数据时 它似乎仍在使用旧数据。为什么会这样?可以 第 3 点是什么原因?
  3. 文本框更新后,我进行了测试并设置了数据上下文 什么都没有,并将数据上下文重新应用于同一来源。价值 显示的是我编辑它们之前的值。为什么他们在编辑后出现了,但是 重新绑定后返回旧值?
  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-更新页面右侧的事件

    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 here 的答案。如果您的 UI 没有更新您的视图模型,则绑定有问题。发布您的 XAML。如果你的 UI 正在更新你的视图模型,那么在你的属性的设置器中对它做出反应显然要容易得多,或者由于某种原因失败了,通过处理你的视图模型的 PropertyChanged 事件。
  • 感谢您的评论。我似乎找到了正确的页面并在您打字时解决了我自己的问题。您对问题 1 的链接确实更详细地解释了这一点,我会仔细阅读它几次,以确保我将来不会再次陷入这个陷阱。再次感谢!

标签: c# wpf data-binding


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多