0

WPF ウィンドウに ListView があり、すべてを選択するボタンがあります。最初に、リストビュー内のすべてのアイテムを選択するボタンを取得するにはどうすればよいですか。

次に、選択したすべてのアイテムを確認するには、ViewModel が必要です。ViewModel でこの情報を取得するにはどうすればよいですか?

IsSelected プロパティを使用してこれを行うことができると読みましたが、ローカル プロパティがバインド プロパティをオーバーライドするバグがあるため、以前に選択されている場合は、再度選択されているようには見えません。複雑なようです。この問題を調べているブログ

次に、このブログData binding to selected itemsを読みましたが、これも非常に複雑に見えます。

それが複雑である必要があるかどうか、そしてそれらの例が前進する唯一の方法であることを知りたいです.

XAML:

        <ListView Name="sources_ListView" Grid.RowSpan="1" ItemsSource="{Binding Path=Sources}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="290" Header="Name">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=OriginalPath}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Width="80" Header="Type">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Type}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

<Button Grid.Row="0" Grid.Column="0" Content="Select All" Name="selectAllSources_Button" Margin="3" />
<Button Grid.Row="0" Grid.Column="1" Content="Deselect All" Name="deselectAllSources_Button" Margin="3" />
<Button Grid.Row="0" Grid.Column="3" Content="Remove Selected" Name="removeSelected_Button" Margin="3" Width="100" HorizontalAlignment="Right" />
4

4 に答える 4

3

ボタンにハンドラーをアタッチします -

<Button Click="Button_Click"/>

SelectAllListView インスタンスでメソッドを呼び出します -

private void Button_Click(object sender, RoutedEventArgs e)
{
   sources_ListView.SelectAll();
}

第 2 に、ビューですべての項目が選択されている場合、その場合ItemsSourceは常に と等しくなりSelectedItemsます。したがって、あなたのケースでは、ItemsSource を単純に反復処理しSourcesます。

于 2012-11-27T18:37:10.490 に答える
0

これを処理する添付のビヘイビアをかなり前に作成しました。これにより、SelectedItems のリストをビュー モデルの監視可能なコレクションにバインドし、前後の変更を処理できます。

アタッチされた動作を使用することは、(コントロールをサブクラス化する代わりに) 既存のコントロールに機能を拡張するための推奨される方法です。

ビューにロジックを配置するよりも、常にこのアプローチを使用する必要があるとは言いません。しかし、簡単に再利用できるように動作をキャプチャする簡単な方法です。

于 2012-11-27T21:29:59.510 に答える
0

@ RV1987あなたの答えをありがとう、それは間違いなくその大部分でした。ただし、残りの部分については、ソースコードでそれを行う方法を正確に説明しているこのブログを見つけました。間違いなく読む価値があります。

悪いエントロピー ブログ

ありがとう

于 2012-11-29T11:22:52.593 に答える
0

次のような方法で、コントロール内のプロパティを項目のコレクションのプロパティにバインドできるようにする動作を作成しました。

  • コントロールのプロパティを変更すると、すべての項目が更新されます。
  • アイテムのプロパティを変更すると、すべてのアイテムが同じプロパティを持つ場合、コントロールに反映されます。そうでない場合、コントロールのプロパティにはフォールバック値 (null など) が与えられます。

これを使用して、CheckBox.IsChecked を、このタイプの要素のコレクション内のタイプの IsSelected プロパティにバインドできます。私は、あなたが望むものと似たようなことをしたいが、DataGrid を使用する人に提案しました。こちらでご覧いただけます。

于 2012-11-27T19:26:00.493 に答える