2014-02-23 65 views
1

我想在一個單獨的線程中綁定一個gridview異步等待綁定網格

幾乎每個示例在描述長時間運行的任務時都使用await Task.Delay(10000);,但我實際上想在此處做一些工作。

如何綁定到網格異步(或任何一般工作)?

private async void BindGrid_Click(object sender, EventArgs e) 
{ 

     string result = await BindFileGridTemp(); 
     RadMessageBox.Show(result); 

} 

public async Task<string> BindFileGridTemp() // Bind Grid 
{ 


     // Bind Grid here......... 
     //this.radGridViewFiles.DataSource = null; 
     //this.radGridViewFiles.DataSource = MyGlobals.ListOfItemsToControl.ToList() 

     await Task.Delay(10000); // I dont want this but its on every example for async and await 
     return "I am finished"; 

} 
+2

將網格綁定到一些東西上(比如一個屬性 - 實現INotifyPropertyChanged),然後你工作,*在* await之後,設置屬性。 –

+3

你不能真正等待數據綁定,因爲它必須在UI線程上運行。您*可以*等待從任何地方提取數據,但實際綁定必須在UI線程上發生 – James

+1

爲其創建新任務不是一個好主意,但您可以嘗試使用公共異步任務 BindFileGridTemp ) this.radGridViewFiles.DataSource = await Task.Run(()=> MyGlobals.ListOfItemsToControl.ToList()); 返回「我完成了」; }' –

回答

2

我想一個GridView在一個單獨的線程綁定。

正如其他人所指出的,你實際上不能在另一個線程中執行綁定;它必須是UI線程。

幾乎每個示例都使用await Task.Delay(10000);當他們描述一個長期運行的任務時,但我真的想在這裏做一些工作。

await Task.Delay是異步等價物Thread.Sleep。它只是意味着「放任何你不得不在這裏做的異步工作」。

我如何綁定到一個網格異步(或任何工作一般)?

它可以是如此簡單:

public async Task<string> BindFileGridAsync() 
{ 
    this.radGridViewFiles.DataSource = await GetMyDatasourceAsync(); 
    return "I am finished"; 
} 

注意,這是不符合MVVM模式線。要遵循MVVM模式,請執行Peter Ritchie的建議:將數據綁定到ViewModel屬性的RadGridView.DataSource XAML屬性,在創建ViewModel時啓動異步操作,然後使用生成的值更新屬性。如果你正在做異步數據綁定,我有一個blog post that may help