选择Row on RowClick而不是Control Click



当我创建DataGrid时,默认情况下,要选择一行,我需要单击单元格内的控件。

我想在行中单击的任何位置选择行。

有办法做到这一点吗?

<DataGrid AutoGenerateColumns="False"
CanUserAddRows="False" 
IsReadOnly="True"
Style="{StaticResource DataGridStyle}"
HorizontalContentAlignment ="Center"
VerticalContentAlignment ="Center"
VerticalScrollBarVisibility="Auto"
SelectionMode="Single"
ItemsSource="{Binding Items, Mode=OneWay}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name}"
Width="4*" />
<DataGridTextColumn Header="Description"
Binding="{Binding Description}"
Width="4*" />
</DataGrid.Columns>

如果您想选择行,即使您不会单击特定的单元格,也应该为DataGridRow添加带有EventSetter的ItemContainerStyle,如下所示:

<Grid>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Customers}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Name" Binding="{Binding Surname}" />
<DataGridTextColumn Header="Name" Binding="{Binding Age}" />
</DataGrid.Columns>
<DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type DataGridRow}">
<EventSetter Event="MouseDown" Handler="DataGridRow_MouseDown" />
</Style>
</DataGrid.ItemContainerStyle>
</DataGrid>
</Grid>

在后面的代码中,您可以从sender获得datarowgrid,遍历可视化树以获得datagrid本身(例如,如果您不想用x:name调用它(,然后简单地将SelectedItem设置为dataGridrow.Item

private void DataGridRow_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
var dataGridRow = (DataGridRow)sender;
if (dataGridRow != null)
{
var dataGridRowParent = FindParent<DataGrid>(dataGridRow);
if (dataGridRowParent != null)
{
dataGridRowParent.SelectedItem = dataGridRow.Item;
}
}
}
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}

最新更新