2017-02-22 12 views
2

У меня есть сетка данных, из которой я могу удалить элементы. Удаление элемента означает, что он больше не отображается в dataGrid, но он все еще находится в DataSource.Как получить элемент после выбранного элемента в Wpf DataGrid на основе критериев?

Как я могу установить элемент (который будет виден в списке после удаления выбранного элемента) в соответствии с выбранными?

Мне нужно получить объект сам, потому что мне нужно проверить некоторые дополнительные критерии, но единственный способ, который я могу придумать, - это некоторые неприятные для циклов.

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> 
+1

Вы используете привязки данных для заполнения сетки данных и установить текущий выбранный элемент? Если это так, мы могли бы использовать xaml. В противном случае, почему бы не использовать .IndexOf() для текущих элементов перед удалением, выберите этот индекс после удаления? –

+0

Да, я использую привязку данных, но 'AutoGenerateColumns =" ​​False "' –

ответ

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; 
      } 
     } 
    } 
} 
1

Попробуйте это, если вы хотите, чтобы выбрать элемент, который следует tableSelectedItem в Items коллекции DataGrid:

var tableSelectedItem = (PartialPaymentDTO)this.TableDataGrid.SelectedItem; 
int indexOfSelectedItem = this.TableDataGrid.Items.IndexOf(tableSelectedItem); 
int indexOfNextItem = indexOfSelectedItem + 1; 
if (this.TableDataGrid.Items.Count > indexOfNextItem) 
    this.TableDataGrid.SelectedItem = this.TableDataGrid.Items[indexOfNextItem]; 
+0

Спасибо, это не тот ответ, который я искал, но это привело меня к ответу. –

+0

Ответ, который вы опубликовали, использует метод IndexOf, как я предложил, в чем разница? И IndexOf и OfType действительно используют цикл под капотом ... – mm8

+0

Объект, следующий в списке, не должен выполнять критерии как следующий выбранный элемент. Таким образом, получить индекс + 1 элемент было недостаточно. Еще раз спасибо за ваш ответ, это помогло мне решить мою проблему, но это не было решением моего вопроса. –

Смежные вопросы