2017-02-22 111 views
2

我有一個數據網格,我可以從中刪除項目。刪除一個項目意味着它不再在dataGrid上可見,但它仍然在DataSource中。如何根據條件在Wpf DataGrid中的選定項後獲取項目?

如何爲選中我可以設置的項目(將出現在這次的名單後,我刪除當前選中項)?

我需要得到對象本身,因爲我要檢查一些額外的標準,但我能想到的唯一的辦法就是一些討厭的for循環。

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

編輯:獲取選定項目後的整個項目列表也將非常有用。

請注意,我沒有從我的數據源項目。相反,我根據標準將它們隱藏在網格中。

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

是否使用數據綁定填充數據網格並設置當前所選項目的下一個項目?如果是這樣,我們可以使用xaml。否則,爲什麼不使用.IndexOf()之前的當前項目刪除之後刪除選擇該索引? –

+0

是的,我正在使用數據綁定,但'AutoGenerateColumns =「False」' –

回答

0

由於有列表中的很多項目,循環:

WPF:如果你想選擇Items收集DataGrid的在下面tableSelectedItem項目

<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

試試這個通過每次移除所有項目都不是一種選擇。

在這到底是怎麼確定需要選擇

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; 
      } 
     } 
    } 
} 
+0

謝謝,這不是我一直在尋找的答案,但它讓我找到答案。 –

+0

你發佈的答案使用了IndexOf方法,因爲我建議有這種區別?並且IndexOf和OfType確實在引擎蓋下使用循環... – mm8

+0

列表中下一個的對象不必滿足下一個選定條目的條件。所以採取指數+1項是不夠的。 再次感謝您的回答,它幫助我解決了我的問題,但這不是我的問題的解決方案。 –