ListView + MultipleSelect + MVVM =?

Если бы я сказал: "Черт с ним!", Я мог бы просто дать свой ListView с SelectionMode= "Multiple" имя, и быть в состоянии получить все выбранные элементы очень легко. Но я пытаюсь придерживаться MVVM как можно больше, и я хочу каким-то образом привязать databind к ObservableCollection, который содержит значение из столбца Name для каждого выбранного элемента. Как ты это делаешь? Одиночный выбор прост, но решение multi selection не очевидно для меня с моим текущим WPF / MVVM знание.

Я прочитайте этот вопрос на SO, и хотя это дает мне хорошее представление, я не знаю, как добавить необходимую привязку к строке, потому что я использую ListView с GridView в качестве его представления, а не ListBox.

вот как выглядит мой XAML в основном:

<ListView DockPanel.Dock="Top" ItemsSource="{Binding ClientPreview}" SelectionMode="Multiple">
    <ListView.View>
        <GridView AllowsColumnReorder="False">
            <GridViewColumn Header="Name">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Name}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Address">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Address}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

похоже, что правильно сделать, это привязать свойство IsSelected каждой строки к каждому объекту, хранящемуся в коллекции ObservableCollection, к которой я привязываю данные. Я просто не знаю, как это сделать.

1 ответов


напишите ItemContainerstyle в ListView и поместите сеттер для привязки к свойству ViewModel 'IsSelected'

<Style TargetType="{x:Type ListViewItem}">
   <Setter Property="IsSelected" Value="{Binding IsSelected,Mode=OneWayToSource}"/>