2010-02-17 2 views
11

Я выясняю способ выбора нескольких элементов в виде списка и их удаления при определенном действии. Что я не могу понять, как мне выбрать эти несколько элементов? Я бы подумал, что есть список, который мне нужно будет добавить в него, но как лучше всего подойти к этой ситуации, есть ли у вас какие-либо идеи? Спасибо! КевинWPF ListView Выбор нескольких объектов просмотра списка

ответ

21

Набор SelectionMode для Multiple или Extended и перебирать SelectedItems в вашем ListView.

+1

Стоит отметить, что 'SelectionMode.Multiple' не включает в себя возможность использования Shift + Нажмите, чтобы выбрать последовательные элементы или Ctrl + A, чтобы выбрать все.Похоже на ошибку/недосмотр. – Livven

+0

Неисправна ссылка - SelectedItems. –

+0

Исправлено! Благодаря!! – Arcturus

4

Вы можете сделать одно из следующих действий ...

ListView.SelectionMode = SelectionMode.Extended в код-сзади или

<ListView SelectionMode="Extended"></ListView> в XAML

вы также «несколько» SelectionMode еще можно скорее пойти на " extended ', который позволяет пользователю выбирать несколько элементов только с помощью модификатора сдвига.

Для удаления элементов, выбранных можно использовать ListView.SelectedItems Собственость следующим

while(myListView.SelectedItems.Count > 0) 
{ 
    myListView.Items.Remove(list.SelectedItems[0]); 
} 

[или вы могли бы использовать свойство SelectedIndices]

Надежда это позволит избежать проблем с которой вы столкнулись :)

Приветствия!

8

Я хотел бы предложить не использовать SelectedItems свойства ListView, вместо того, чтобы связать Selected свойства одного ListViewItem, к соответствующим ViewModel классу. После этого единственное, что вам нужно сделать, это найти все объекты ViewModel, которые связали свойство Selected TRUE, удалить их из коллекции моделей (если вы удалили) и обновить интерфейс. Если коллекция ObservableCollection, пользовательский интерфейс будет обновлен автоматически. Удачи.

+2

Не могли бы вы объяснить, почему вы не должны использовать свойство 'SelectedItems'? –

+1

, потому что он делает дизайн более сложным и может привести к ошибкам. Если у вас есть выбранное свойство для каждого объекта, находящегося в элементе ItemsSource, вы можете легко связать каждый элемент следующим образом:

+0

@NomanKhan Должен быть ListViewItem не ListBoxItem; тоже не нужно для BasedOn, я думаю ... Но хороший комментарий, помог мне! –

0

Получить успех и WPF ListView написав

while (lvJournalDetails.SelectedItems.Count > 0) 
{ 
    lvJournalDetails.Items.Remove(lvJournalDetails.SelectedItem); 
} 
1

Арктур ​​ответ хорош, если вы не используете MVVM. Но если вы это сделаете, а ваш ItemsSource привязан к некоторому ObservableCollection объектов в вашей ViewModel, я бы порекомендовал Tigran ответить с разъяснением Номана Хана.

Вот как это будет выглядеть так:

<ListView ItemsSource="{Binding SomeListViewList}"> 
    <ListView.Resources> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Setter Property="IsSelected" Value="{Binding SomeItemSelected, Mode=TwoWay}" /> 
     </Style> 
    </ListView.Resources> 
    ... 
</ListView> 

В Модельное вы бы объект: public ObservableCollection<SomeItem> SomeListViewList{ get; set; }

SomeItem Class будет включать выбранное свойство:

public class SomeItem 
{ 
    public string SomeItemName { get; set; } 

    public string SomeItemNum { get; set; } 

    public bool SomeItemSelected { get; set; } 
} 

Тогда вы могли бы итерации/запуска по списку и получения тех, которые выбраны:

foreach (var item in SomeListViewList) 
    if (item.SomeItemSelected) 
     // do something 
Смежные вопросы