如何根据条件获取Wpf DataGrid中所选项目后的项目?

时间:2017-02-22 15:28:14

标签: c# wpf datagrid

我有一个数据网格,我可以从中删除项目。删除项目意味着它不再在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>

2 个答案:

答案 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;
            }
        }
    }
}