我有一个datagrid:
<DataGrid x:Name="grid" ItemsSource="{Binding DataGridCollection}" Margin="0,61,0,0" SelectionUnit="Cell">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="#FF0070CD" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="Transparent" />
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="#FF90CDFF" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
SelectionUnit
设置为&#34; Cell
&#34;。我想要实现的是,当我选择一个Cell时,它会将整个Row和Cyan的蓝色设置为选定的Cell。
什么不起作用?这是我现在得到的结果:
这是目标:
答案 0 :(得分:0)
好的,在尝试了一下后,我确信你不能完全用XAML做这件事。这是因为您可以选择单元格或行,但不能同时选择单元格和行。我可能在这里错了。
SelectionUnit应该仍然是单一的,但我们只会选择一个样式进行单元格选择。在这里,我选择了一种绿色。
<DataGrid MouseDoubleClick="DataGrid_DoubleClick" SelectionUnit="Cell">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="#32CD32" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
</DataGrid>
现在,我们将在后面的代码中单击该行时为该行着色。不是一个优雅的解决方案,但仍然是一个解决方案。
private void DataGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;
DataGridCell cell = DataGridHelper.GetDataGridCell(dep);
DataGridRow row = DataGridHelper.GetDataGridRow(dep);
if (row != null)
{
if (row != lastRowSelected)
{
if (lastRowSelected != null)
{
lastRowSelected.Background = colorOfLastRowSelected;
}
lastRowSelected = row;
colorOfLastRowSelected = row.Background.Clone();
}
row.Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#6A5ACD"));
}
}
为此,我们需要两个私有字段:
private DataGridRow lastRowSelected;
private Brush colorOfLastRowSelected;
我们需要这些来记住我们选择它之前一行的颜色。这也适用于交替的行颜色。
最后,我们需要一个帮助函数来获取DataGridRow:
public static DataGridRow GetDataGridRow(DependencyObject dep)
{
while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep is DataGridColumnHeader)
{
DataGridColumnHeader columnHeader = dep as DataGridColumnHeader;
}
DataGridRow row = null;
if (dep is DataGridCell)
{
DataGridCell cell = dep as DataGridCell;
// navigate further up the tree
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
row = dep as DataGridRow;
}
return row;
}
无论如何,这应该让你到达你需要的地方!祝你好运。