2008-11-18 70 views
4

有沒有辦法關閉Silverlight中內置DataGrid中第一行的自動選擇?當設置ItemSource/DataContext時,Silverlight DataGrid自動選擇排序,

我們根據用戶選擇數據網格中的一行來構建很多功能。數據綁定或排序時SelectionChanged的自動觸發真的會引起我們的問題。我們試圖在選擇時加上一些警衛,但似乎無法涵蓋所有​​問題。

例如,如果您在加載屏幕時未顯示的TabControl的選項卡中包含DataGrid,並且DataGrid具有對作爲對象列表的DataContext屬性的綁定。在顯示標籤之前,網格不是數據綁定的。有沒有事件告訴我們該網格是數據綁定?數據綁定的默認行爲不應該選擇一行嗎?

感謝 邁克

回答

0

一個布爾屬性由於DataGrid的代碼可以從Microsoft,我們刪除了選擇,所以我們不必解決它。我相信這不再是Silverlight 3.0網格的問題。

1

麥克,

我已經通過包裝窗口控制,並捕捉包裝的Windows網格的選擇改變了事件解決了這個問題。

在您的控件中,連接控件的Loaded事件,並在加載時將boolean私有成員變量設置爲true。然後,當您捕捉內部數據網格的選擇更改事件時,如果您加載了控件,則只會引發您自己的選擇更改事件。完成後,現在可以返回到OnApplyTemplate子設置,並將內部數據網格的選定索引設置爲-1,並將所選項目設置爲無。由於索引和項目的設置將在控件加載完成之前發生,選擇更改事件不會觸發。我已經在標籤和非標籤的環境中嘗試了這一點,並且它看起來沒有問題。現在遇到一些棘手的問題,您可能會注意到,當您對窗口數據網格進行排序時(雖然它將數據綁定到一個ItemsSource),但它始終選擇顯示數據的頂層項目。當然,這將激發選擇更改的事件,並移動到之前未選中的項目,並且據我所知,不應該被選中。要處理這個問題,你必須做一些更棘手的編碼。如果你注意到,當你捕捉到內部網格的選擇改變的事件,並且查看它選擇的項目時,只有少數情況下選擇的項目沒有被設置爲任何東西,那些是當不再選擇項目時(即。選擇被清除),或者當(提示)列正在排序時。在排序時,有兩個事件觸發,第一個是取消選擇項目(SelectedItem爲Nothing),第二個是列表中頂部項目(SelectedIndex 0)的選擇。現在,如果要在內部網格選擇更改事件的事件處理程序中放置標誌,並且發現該項目沒有任何內容,則可以跟蹤之前選定的項目,然後設置內部數據網格的選定項目到先前選擇的項目。

這很好地解決了這個問題,並且在包裝Windows控件時總是會有不期望的結果,但據我所知,這似乎是解決在加載時選擇第一行的唯一方法問題。然而,我只能想象,這將在某個時刻由M $確定。

我希望這有助於

感謝,

斯科特

3

你有沒有嘗試設置你在你的用戶控件的構造函數設置爲false一個布爾字段(例如:布爾dataGridFirstLoad)。

然後在DataGrid的SelectionChanged事件上,檢查dataGridFirstLoad是否爲false。如果false設置爲true並將SelectedItem設置爲null。

希望這會有所幫助。

0

下面的代碼應該這樣做(JustRefreshed爲true,無論您更新集/刷新網格):

int LastSelectedIndex = -1; 
bool JustRefreshed = false; 

     private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (JustRefreshed) 
      { 
       JustRefreshed = false; 
       dataGrid.SelectedIndex = LastSelectedIndex; 
       return; 
      } 
      if (e.AddedItems.Count > 0) 
      { 
       LastSelectedIndex = dataGrid.SelectedIndex; 
         }  
       //Your logic comes here... 
      } 
     } 
1

這是類似於上述職位(和哈希了聖保羅T的建議)。這很好。 //在XAML或在構造 設置的SelectionChanged處理程序//我有我的網頁上2個格,所以我創建的每個

private bool IsFirstLoad { get; set; } 
private bool IsFirstLoadDetails { get; set; } 
public BookDisplay() 
{ 
    //code here 
    this.IsFirstLoad = true; 
    this.IsFirstLoadDetails = true; 
    BindBooks(); //define this function (not in this snippet for the sake of brevity) 
} 
private void GridBooks_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (this.IsFirstLoad) 
    { 
    GridBooks.SelectedItem = -1; 
    this.IsFirstLoad = false; 
    } 
    else 
    { 
    //do your stuff 
    } 
} 
private void GridBooksWithDetails_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (this.IsFirstLoadDetails) 
    { 
    GridBooksWithDetails.SelectedItem = -1; 
    this.IsFirstLoadDetails = false; 
    } 
}