2012-11-27 61 views
2

我有一個SDK:DATAGRID有20列左右,當它打開時它只顯示四個字段/列。這是我想要什麼,我如何把它設計Datagrid on demand load off

基本上我根據用戶點擊抓取信息 - 例如:

OWNERNAME.Text = ((TextBlock)EPICGrid.Columns[1].GetCellContent(EPICGrid.SelectedItem)).Text; 

和/或

OWNERNAME2.Text = ((TextBlock)EPICGrid.Columns[16].GetCellContent(EPICGrid.SelectedItem)).Text; 

什麼我跑進入它不會抓住單元格中的信息,除非我滾動並顯示列,所以我只能抓住前4列數據,因爲它們顯示網格變得可見時。

我無法從第5-20列的數據中獲取數據,除非我對這些列進行調整並使其可見。他們不必在點擊過程中可見......它似乎只是在查看該列之前數據才真正加載。

我想我應該說第一個記錄/行加載所有的數據/單元格/列,我可以從第一個記錄抓取任何數據,但問題發生在記錄2 - *。

只是澄清 - 我的問題不是我的列或行的可見性。我的問題是SDK DataGrid看起來像是在按需加載數據。因此,如果該列在某一點或另一點不在視圖中,則單元中的信息不可用。

我不想顯示所有列,也不想讓用戶看到所有列,因此我想禁用滾動條,但是當用戶點擊某一行時,我需要抓取信息在某些單元格中,並且由於該列尚未加載,所以信息不存在。

如何關閉按需功能?

我做了搜索,發現有人曾與行裝載和建議被設置VirtualizingStackPanel.VirtualizationMode = Standard

它幾乎像這個問題是從VirtualizingStackPanel.VirtualizationMode梗,但我將此屬性設置爲標準,類似的問題回收和沒有運氣。

這裏的定義:

缺省情況下,VirtualizingStackPanel用於 創建一個項目容器中的每個可見項目,並丟棄它,當不再需要它(如 當該項目被滾出視)。當ItemsControl包含很多項目時,創建和丟棄項目容器 的過程可能會對性能產生負面影響。當 VirtualizingStackPanel.VirtualizationMode設置爲Recycling時,VirtualizingStackPanel重新使用項目容器,而不是每次創建一個新的 。

在初始加載時,如果單元格不可見,我不能抓住單元格 的內容(除非它是第一個記錄/行)。一旦和之後的細胞/ 列是可見的,那麼信息是可用的。

回答

0

我認爲你應該直接處理行綁定的數據,而不是將數據從控件中提取出來。這是有道理的,因爲它是雙向數據綁定,從而你正在改變它的數據被更新(假設它實現INotifyPropertyChanged接口)。

一個例子是其中數據網格被綁定到類型myEntity所的集合。

 private void DataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (this.DataGrid1.SelectedItem == null) 
       return; 

      MyEntity myEntity = (MyEntity)this.DataGrid1.SelectedItem; 

      // at this point you have the (updated) data the row is bound to. 
      MessageBox.Show("You Selected: " + myEntity.name); 
      ... 

另一個例子是每一行上都有一個按鈕。該代碼來處理單擊按鈕時看起來是這樣的:如果你不熟悉的一些通常被用來使用Silverlight看看這些Video Tutorials的技術

 private void btnProcessEntity_Click(object sender, RoutedEventArgs e) 
     { 

     Button btn = sender as Button; 
     MyEntity myEntity = btn.DataContext as MyEntity; 

      // clicking a button in a row doesn't select the row, so select it. 
     this.DataGrid1.SelectedItem = myEntity; 
     MessageBox.Show("Will Process: " + myEntity.name); 

      ... 
     } 

。它是VB.Net,但代碼並不是重點 - 它專注於Silverlight應用程序體系結構。我將從「SL4和WCF Ria服務介紹」開始,然後查看MVVM中的其中一個。

+0

JBrooks,感謝您的帖子。我有麻煩搞清楚什麼是myEntity所...我需要聲明或添加REF /組裝故reconized ...對不起我還是綠色的。 –

+0

@DickLong myEntity所只是我舉的例子一樣MyTable的,MyClass的,等在Silverlight實體的集合通常是從實體框架直通RIA服務得到它後一個DataGrid綁定到什麼。這3種技術在Silverlight應用程序中很常見。 – JBrooks