Невозможно выбрать несколько строк в сетке данных WPF
Хотя у меня есть SelectionMode="Extended"
а также SelectionUnit="FullRow"
установить, когда я отлаживаю SelectionChanged
событие, всегда есть только один выбранный элемент в SelectedItems
,
Это мое DataGrid
:
<DataGrid Grid.Row="0" AutoGenerateColumns="False" Margin="5,5,5,0"
Name="dgrMembersClub1" ItemsSource="{Binding .}" CanUserAddRows="False"
SelectionMode="Extended" SelectionUnit="FullRow" SelectionChanged="Grid_SelectionChanged">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Joining" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn IsReadOnly="True" Header="Surname" Binding="{Binding Surname}" />
<DataGridTextColumn IsReadOnly="True" Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn IsReadOnly="True" Header="Club" Binding="{Binding Club_Id, Converter={StaticResource ClubName}}" />
<DataGridTextColumn IsReadOnly="True" Header="City" Binding="{Binding City}" />
</DataGrid.Columns>
</DataGrid>
И мой Grid_SelectionChanged
событие:
private void Grid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid grid = (DataGrid)sender;
var test = grid.SelectedItems; //Count == 1 (always)
}
У меня есть триггеры (в App.xaml), которые изменяют фон и кисти переднего плана для выбранных и чередующихся строк. Если это актуально, пожалуйста, дайте мне знать, и я добавлю код.
* РЕДАКТИРОВАТЬ *
Пока вы работаете над этим, я мог бы также помочь установить флажок в шаблоне ячейки. Довольно пожалуйста:)
2 ответа
Свойство SelectedItems объекта DataGrid содержит список хорошо выбранных элементов...
private void DataGrid_SelectionChanged(object sender,
SelectionChangedEventArgs e)
{
// ... Get SelectedItems from DataGrid.
var grid = sender as DataGrid;
var selected = grid.SelectedItems;
foreach (var item in selected)
{
var dog = item as Dog;
}
}
Этот индикативный обработчик событий получает SelectedItems и проходит через него.
Тем не менее, есть одна оговорка:
"Если для свойства SelectionMode установлено значение Single, список SelectedItems будет содержать только значение свойства SelectedItem."
Свойство SelectedItems наследуется от IList, поэтому его можно приводить и выполнять над ним операции LINQ. Это также хорошо работает с несмежными выборами.
Дополнительные советы на http://www.dotnetperls.com/datagrid
private IEnumerable<DataGridRow> GetDataGridRows(DataGrid grid)
{
var itemsSource = grid.ItemsSource as IEnumerable;
if (null == itemsSource) yield return null;
foreach (var item in itemsSource)
{
var row = grid.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
if (null != row & row.IsSelected) yield return row;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var rows = GetDataGridRows(dgv_Students);
string id; //Sample =>"85-999888-2"
foreach (DataGridRow dr in rows)
{
id = (dr.Item as tbl_student).code_meli;
MessageBox.Show(id);
}
}