Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Binding IsSelected to ViewModel doesn't set items that haven't been shown in the List

I have a ViewModel that has an IsSelected property which I bind in my ListView.ItemContainerStyle XAML to an IsSelected property in my view model.

I bring up the application and populate the view model collection (which is shown in my ListView) with a lot of items, say about 2000. Then I select everything in the list via Ctrl-A. The items in my view model collection only get the IsSelected set for the items that are visible in the ListView. If I page down through the list the IsSelected gets set for whatever items get shown. If I page through all the items then all the items in my view model have the IsSelected property set to true.

Here is my XAML for binding the IsSelected in the list view to my view model:

<ListView Margin="5" ItemsSource="{Binding FilteredComparisonList}" x:Name="comparisonListView">
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Source filename" DisplayMemberBinding="{Binding ImageFile.BaseFilename}" Width="Auto" />
        </GridView>
    </ListView.View>
</ListView>

Why isn't IsSelected for all the items in my view model set to true when I select all the items in the ListView?

like image 798
Buck Avatar asked Jan 14 '10 22:01

Buck


2 Answers

The MVVM way to do this would be to override the Ctrl-A shortcut with your own SelectAll command (Create a SellectAll command with a shortcut of Ctrl-A). The implementation will set IsSelected on the view models.

Your IsSelected property in your view needs to have a two way binding to your view model so that the items appear selected in your view.

I dont think turning off virtualisation is nessesary.

Hope this helps.

like image 97
Steve Psaltis Avatar answered Oct 08 '22 16:10

Steve Psaltis


This is happening because of the ListView's built-in virtualization. If you're not familiar with that, what it basically means is that the items don't become real until they are in view. You can turn off the ListView's virtualization with the following property:

VirtualizingStackPanel.IsVirtualizing="False"

But beware this will have an adverse effect on your ListView's performance. For 2,000 items it won't be severe, but it might be noticeable.

like image 31
Charlie Avatar answered Oct 08 '22 16:10

Charlie