2011-10-25 29 views
0

我似乎有衝突的要求。我有一個複選框作爲第一列的DataGrid。用戶希望複選框可以通過單擊進行選擇,而不是雙擊。我是能夠使使用DataGridTemplateColumn和這樣一個複選框,發生:在複選框上使用DataGrid上的ScrollIntoView更改行爲

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <CheckBox IsChecked="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

用戶也允許他們指定行控制(可以有數百行)。如果他們指定了一個不在視圖中的行,我希望它滾動到視圖中。我妥協並在DataGrid_SelectionChanged事件的後面代碼中添加了一個事件處理程序。最初我只是使用ScrollIntoView命令,但屏幕外的行會突出顯示,但網格不會將它們滾動到視圖中。然後,我可以添加一個Focus命令,並將該行滾動到視圖中。所以,現在的事件處理程序是這樣的:

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    DataGrid dg = (DataGrid)sender; 
    if (dg.SelectedItem == null) return; 
    dg.ScrollIntoView(dg.SelectedItem); 
    dg.SelectedItem.Focus(); 
} 

現在我回到原來的問題,該行滾動到視圖,但來檢查任何其他行的複選框(您不要通過進入跳轉到行控制),你必須點擊兩次。有人知道是什麼導致行移動到手動需要雙擊?

+1

我無法獲得'dg.SelectedItem.Focus()'方法。你確定這是你的代碼嗎?無論如何,如果沒有它,我可以讓dataGrid將selectedItem滾動到視圖中(我假設在另一個控件中設置了selectedItem),並且單擊複選框dataTemplate在所有其他行上都像一個魅力一樣工作......您的代碼示例中是否存在某些內容? – philt5252

+0

您的權利,我以爲我複製和粘貼,但我嘗試了很多事情(並有點沮喪),我不能再確定是什麼原因造成的問題,但我確實找到了答案。 – Tod

+0

好吧,至少它的工作:P – philt5252

回答

0

嗯,我得到它與下面的代碼,這是由一些切線相關的帖子,使焦點進入細胞的啓發。我不知道爲什麼ScrollIntoView不工作,工作或爲什麼執行最後三行是我可以在不禁用複選框的情況下滾動到視圖中的一種方式。

private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    DataGrid dg = (DataGrid)sender; 
    if (dg.SelectedItem == null) return; 
    dg.ScrollIntoView(dg.SelectedItem); 

    DataGridRow dg_row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromItem(dg.SelectedItem); 
    if (dg_row == null) return; 
    dg_row.Focus(); 
    }