2013-11-14 61 views
0

我不理解關於數據綁定的以下4點。不知道如果我得到意想不到的結果(代碼背後的過時數據),或者如果這只是我誤解了事情工作的結果。使用過時值進行數據綁定更新

  1. 當我離開文本框時將數據綁定到文本框更新。什麼事件 確切地這樣做?引發LostFocus?
  2. 當在 後面的代碼中使用現在更改的數據時,它似乎仍使用OLD數據。這是爲什麼發生?可以 點3是原因嗎?
  3. 在文本框更新之後,我做了一個測試,並將datacontext 設置爲空,並將datacontext重新設置爲同一個scource。顯示的值爲 是我編輯它們之前的值。爲什麼在編輯後顯示,但 重新綁定後返回到舊值?
  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-事件經常更新的右側,他頁

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

您可以閱讀所有關於問題1的答案[這裏](http://msdn.microsoft.com/en-us/library/ms754356%28v=vs.110%29.aspx)。 如果你的UI沒有更新你的視圖模型,那麼綁定有問題。發佈您的XAML。如果你的UI *更新你的視圖模型,那麼在你的屬性設置器中對它做出反應顯然要容易得多,或者由於某種原因,通過處理你的視圖模型的PropertyChanged事件而失敗。 – mcwyrm

+0

感謝您的評論。我似乎找到了正確的頁面,並在打字時解決了我自己的問題。你和問題1的聯繫確實可以更詳細地解釋這一點,我會多讀幾遍,以確保在未來我不會陷入這個陷阱。再次感謝! – Rattenmann

回答

0

我面臨的問題是在訂單在這種情況下哪些事件會被解僱。或更準確:一次發生兩件事。

TextBox使用「LostFocus」事件更新屬性,與我用來更新其他TextBox控件的事件相同。既然兩者都立刻開火,我用「過時」數據進行計算,因此看起來我的UI在一側落後了一步。

爲了解決這個問題,我只是不得不改變我的文本框更新屬性的方式,做我在XAML綁定是這樣的:

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

現在的屬性立即更新「引發LostFocus」之前甚至更早「框TextChanged」。 這也可以在用戶更改值時更新UI,而不僅僅是在他完成之後。更清潔,更好看。

相關問題