2010-06-01 98 views
1

有沒有辦法模仿CTRL +點擊的行爲,保持先前選定的行選擇,只是添加更多的選定項目?WPF DataGrid SelectedItems - 保持多個選擇,而左鍵點擊

默認情況下,當點擊每一行時,所有先前選定的行都會被取消選中。

實現此目的的一種方法是重寫SelectionChanged事件,並重新選擇刪除的行。

void TestGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
    foreach (var i in e.RemovedItems) 
     TestGrid.SelectedItems.Add(i); 

} 

這是不理想但是,因爲在某些情況下,我會想取消選擇行(例如在一列點擊切換按鈕時)。

回答

0

這裏是爲我工作的解決方案。

我刪除設置的詳細信息可見性的所有屬性(把一切都在默認情況下)

比加入下面的樣式

<Style x:Key="VisibilityStyle" TargetType="{x:Type DataGridRow}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=Visible}" Value="False"> 
      <Setter Property="DetailsVisibility" Value="Collapsed" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=Visible}" Value="True"> 
      <Setter Property="DetailsVisibility" Value="Visible" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

在我基礎數據對象分配這個資源RowStyle

,我添加了Visible屬性,並實現了INotifyPropertyChanged接口。

現在,無論何時我想顯示/隱藏詳細信息,我只需操縱基礎對象上的Visible屬性。這可能發生在列按鈕處理程序中,也可能發生在我的代碼中的任偉大的工作

0

設置SelectionModeDataGridSelectionMode.Extended

+1

nope ..試過..只允許多個選擇,同時按住ctrl – 2010-06-02 11:37:03

+0

我誤解了你的問題然後。你想讓它繼續選擇物品,而他們點擊不同的物品,但沒有掌握控制權? – 2010-06-02 12:03:27

+0

是的,我想模仿ctrl持有行爲,w/out不得不按住ctrl。 – 2010-06-02 12:13:58

2

這不是很漂亮,但它可以工作,如果你可以通過拖動不工作選擇多行。

private void dataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var dep = (DependencyObject)e.OriginalSource; 

    // iteratively traverse the visual tree 
    while ((dep != null) && 
     !(dep is DataGridRow)) 
    { 
     dep = VisualTreeHelper.GetParent(dep); 
    } 

    if (dep == null) 
     return; 

    if (dep is DataGridRow) 
    { 
     var row = dep as DataGridRow; 
     row.IsSelected = !row.IsSelected; 
     e.Handled = true; 
    } 
}