2010-06-01 47 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; 
    } 
}