私はこのコードを持っています:
<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>
これにより、このウィンドウが生成されます。
選択されているチェックボックスの数を確認し、選択されている各Tag
の値CheckBox
を取得するにはどうすればよいですか?
私はそれが古いことを知っていますが、後世のために人々がこれに無精ひげを生やした場合はここに解決策があります
<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つのレコードが含まれることを除いて、単一の選択に対してのみ機能します。
IsChecked
のCheckBox
プロパティをViewModelのプロパティにバインドするのと同じくらい簡単である必要があります(新しいプロパティがまだ存在しない場合は、追加する必要がある場合があります)。次に、ボタンがクリックされると、コレクション内のすべてのアイテムを繰り返し処理し、チェックされているアイテムを削除します(ViewModelのプロパティの値に基づいて)。
提案...
すべてのWindowsコントロールのTagプロパティと同様に、実行時に汎用的に使用するために、すべてのデータモデルに常にTagプロパティがあります。そのプロパティを使用して、ListView内のアイテムのチェック状態を保持します。他の状況では、私はそれらを使用して複雑なオブジェクトも保持します。