2017-02-22 8 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 
    } 
} 

編集:選択したアイテムの後にアイテムのリスト全体を取得すると、本当に役立ちます。

私のデータソースからアイテムを削除しないように注意してください。代わりに、基準に基づいてグリッドで非表示にします。

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:あなたはDataGridItemsコレクションに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の項目を取るだけでは不十分でした。 もう一度、あなたの答えをありがとう、それは私の問題を解決するのに役立ちましたが、それは私の質問のための解決策ではありませんでした。 –

関連する問題