web-dev-qa-db-ja.com

WPFListViewItemアイテムのチェックボックス。選択したすべてのアイテムを取得するにはどうすればよいですか?

私はこのコードを持っています:

<ListView Height="238" 
          HorizontalAlignment="Left" 
          Name="listView1" 
          VerticalAlignment="Top" 
          Width="503"
          ItemsSource="{Binding}"
          IsSynchronizedWithCurrentItem="True">
  <ListView.View>
    <GridView>
      <GridView.Columns>
        <GridViewColumn>
          <GridViewColumn.CellTemplate>
            <DataTemplate>
              <CheckBox Tag="{Binding ID}"/>
            </DataTemplate>
          </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn DisplayMemberBinding="{Binding ID}" Header="ID" />
        <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" />
      </GridView.Columns>
    </GridView>
  </ListView.View>
</ListView>

これにより、このウィンドウが生成されます。

Window rendered by code

選択されているチェックボックスの数を確認し、選択されている各Tagの値CheckBoxを取得するにはどうすればよいですか?

13
Nhu Nguyen

私はそれが古いことを知っていますが、後世のために人々がこれに無精ひげを生やした場合はここに解決策があります

<ListView Height="238" 
              HorizontalAlignment="Left" 
              Name="listView1" 
              VerticalAlignment="Top" 
              Width="503"
              ItemsSource="{Binding}"
              IsSynchronizedWithCurrentItem="True"
              SelectionChanged="listView1_SelectionChanged">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                               <CheckBox Tag="{Binding ID}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />  
                           </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn DisplayMemberBinding="{Binding ID}" Header="ID" />
                    <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" />
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

次に、csファイルコードでこれをlistView1_SelectionChangedに入れます

private List<MyObject> lstMyObject = new List<MyObject>();

private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (MyObject item in e.RemovedItems)
    {
        lstMyObject.Remove(item);
    }

    foreach (MyObject  item in e.AddedItems)
    {
       lstMyObject.Add(item);
    }
}

lstMyObjectは、リストにバインドされているオブジェクトと同じタイプである必要があります。コードは、元のリストのアイテムへの参照をそのリストに追加および削除するだけです。

これで、実際に選択されたアイテムのみが含まれるリストをループするだけで済みます。これは、lstMyObjectに常に1つのレコードが含まれることを除いて、単一の選択に対してのみ機能します。

20
Franck

IsCheckedCheckBoxプロパティをViewModelのプロパティにバインドするのと同じくらい簡単である必要があります(新しいプロパティがまだ存在しない場合は、追加する必要がある場合があります)。次に、ボタンがクリックされると、コレクション内のすべてのアイテムを繰り返し処理し、チェックされているアイテムを削除します(ViewModelのプロパティの値に基づいて)。

6
jeremyalan

提案...

すべてのWindowsコントロールのTagプロパティと同様に、実行時に汎用的に使用するために、すべてのデータモデルに常にTagプロパティがあります。そのプロパティを使用して、ListView内のアイテムのチェック状態を保持します。他の状況では、私はそれらを使用して複雑なオブジェクトも保持します。

0
user3923143