2011-08-08 60 views
0

我有一個Windows窗體「MyForm」,它具有綁定到另一個類「MyData」中的屬性的文本框。數據源更新模式設置爲「On Property Change」綁定到另一個類中的屬性的文本字段不會更新

我使用VisualStudio IDE。它創建了下面的代碼結合

this.txtYield.DataBindings.Add(new Binding("Text", this.BindingSourceMyDataClass, "PropertyInMyDataClass", true, DataSourceUpdateMode.OnPropertyChanged)); 

在表單構造,加入初始化後的值的代碼到邁德特類結合形式

myDataClassInstantiated = new MyDataClass(); 
BindingSourceMyDataClass.DataSource = myDataClassInstantiated; 

的INotifyProperty接口已經實現:

public double PropertyInMyDataClass 
{ 
    get { return _PropertyInMyDataClass; } 
    set 
    { 
     if (!Equals(_PropertyInMyDataClass, value)) 
     { 
      _PropertyInMyDataClass = value; 
      FirePropertyChanged("PropertyInMyDataClass"); 
     } 
    } 
} 

後臺工作者用於運行計算並更新屬性'PropertyInMyDataClass'

我希望窗體上的文本框會在後臺工作完成時自動更新。這並沒有發生

如果我手動複製指定從屬性到窗體的文本框中的值,正常顯示的數值

this.txtYield.Text = String.Format("{0:F0}", myDataClassInstantiated.PropertyInMyDataClass); 

我試圖刷新()和Update()添加到MyForm.MyBackgroundWorker_RunWorkerCompleted方法,但數據仍未刷新。

如果我以後運行不同的背景的工人,同樣的形式更新不同的文本框,勢必PropertyInMyDataClass文本框中被更新

我會很感激的建議,這將有助於我瞭解並解決此數據綁定問題

回答

0

問題來自幾個角度。如果您正在後臺線程上運行進程,後臺線程無法直接直接訪問窗體上的控件(它位於另一個線程中),否則您將得到一個異常。你也不能指望UI線程根據後臺線程中的狀態進行更新,除非你將它連接起來。爲了做到這一點,您需要在主UI線程上調用委託。..

在UI窗體上放置此代碼(修改它以更新所需的任何控件類型)。

public void UpdateOutput(string text) 
    { 
     this.Invoke((MethodInvoker) delegate { 
      lstOutput.Items.Add(text); 
     }); 
    } 

然後你可以在後臺工作線程中調用這個函數。 (假設你的後臺處理功能住在相同的形式,可以直接調用它),如果沒有,那麼你就需要在後臺進程中運行類UI形式的參考。

+0

感謝@大衛C.我在此表單上有大約15個字段需要更新,我可以等到BackgroundWorkker_RunWorkerCompleted在UI線程上調用。你的代碼是解決這個問題的正確方法。如果我可以等到後臺工作人員完成更新字段,那麼是否有辦法啓動刷新? – DarwinIcesurfer

+0

@達爾文你如何構建對後臺工作者的調用,並填充數據對象。數據對象是靜態還是類似的? –

+0

否數據對象不是靜態的,但在後臺工作進程完成之前,沒有任何數據有效。該類具有許多用於計算的輸入屬性,在計算完成後,需要在表單上更新許多結果。也許數據綁定導致我修復更多的問題。 – DarwinIcesurfer

相關問題