我有一个数据网格,我可以从中删除项目。删除项目意味着它不再在dataGrid上可见,但它仍然在DataSource中。
如何设置项目(在我删除当前所选项目后在列表中可见)被选中?
我需要获取对象本身,因为我必须检查一些额外的标准,但我能想到的唯一方法是一些讨厌的循环。
private void OnTakeOneClick(object sender, RoutedEventArgs e)
{
var tableSelectedItem = (PartialPaymentDTO)this.TableDataGrid.SelectedItem;
// var nextItemInGrid = ???
Model.TakeOrderItemsFromTable(tableSelectedItem);
if(tableSelectedItem.QuantityOnTable != 0)
{
this.TableDataGrid.SelectedItem = tableSelectedItem;
}
else
{
// select next item in data grid that based on some extra criteria
}
}
编辑:获取所选项目后的整个项目列表也非常有用。
请注意我不会从我的数据源中删除项目。相反,我会根据标准将它们隐藏在网格中。
WPF:
<DataGrid ItemsSource="{Binding TableItems}" Name="TableDataGrid" AutoGenerateColumns="False"
SelectionChanged ="OnTableDataGridSelected" HeadersVisibility="Column" BorderThickness="0" SelectionMode="Single">
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding QuantityOnTable}" Value="0">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.ItemContainerStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Artikl" Binding="{Binding OrderItemName}" IsReadOnly="True" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="TextAlignment" Value="Left"/>
<Setter Property="Padding" Value="0,6"/>
<Setter Property="TextWrapping" Value="NoWrap"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
答案 0 :(得分:1)
如果要在tableSelectedItem
的{{1}}集合中选择Items
后面的项目,请尝试此操作:
DataGrid
答案 1 :(得分:0)
由于列表中有很多项目,因此无法在每次删除时循环遍历所有项目。
最后,我决定了下一个需要选择的项目
private void OnTakeOneClick(object sender, RoutedEventArgs e)
{
var tableSelectedItem = (PartialPaymentDTO)this.TableDataGrid.SelectedItem;
Model.TakeOrderItemsFromTable(tableSelectedItem);
if(tableSelectedItem.QuantityOnTable != 0)
{
this.TableDataGrid.SelectedItem = tableSelectedItem;
}
else
{
int currentSelectedItemIndex = this.TableDataGrid.Items.IndexOf(tableSelectedItem);
// Skip items before currently selected items
var tableDataGridItemsAfterSelected = this.TableDataGrid.Items.OfType<PartialPaymentDTO>().Skip(currentSelectedItemIndex);
foreach (var item in tableDataGridItemsAfterSelected)
{
if (item.QuantityOnTable != 0) // Criteria check
{
this.TableDataGrid.SelectedItem = item;
break;
}
}
}
}