有没有办法模仿ctrl + click的行为,这会保留选定的先前选定的行,只添加更多选定的项目?
默认情况下,单击每一行时,所有先前选定的行都将被取消选中。
实现此目的的一种方法是覆盖SelectionChanged事件,并重新选择已删除的行。
void TestGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) {
foreach (var i in e.RemovedItems)
TestGrid.SelectedItems.Add(i);
}
然而,这并不理想,因为在某些情况下我会想要取消选择行(例如,当单击其中一列中的切换按钮时)。
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
将SelectionMode
设置为DataGridSelectionMode.Extended
答案 2 :(得分: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属性,以及Implemented INotifyPropertyChanged接口。
现在每当我想显示/隐藏细节时,我只是操纵我的底层对象上的Visible属性。这可以从列按钮处理程序发生到我的代码中的任何其他位置。效果很好