Как удалить ListViewItem при привязке к DataView

Как удалить выбранный ListViewItem из ListView WPF, если для ItemsSource установлено значение DataView? Я могу получить выбранный ListViewItem, а затем как удалить фактическую строку в DataView?

DataView dv = (DataView)myListView.ItemsSource;
ListViewItem lvi = (ListViewItem)myListView.ItemContainerGenerator.ContainerFromItem(myListView.SelectedItem);
<Delete ListViewItem here> 

person John Sheares    schedule 24.10.2009    source источник


Ответы (2)


Когда вы привязываете свою коллекцию к представлению списка, используйте ListCollectionView вместо DataView. Можно легко сделать так (где dataView имеет тип DataView):

ListCollectionView lcv = new ListCollectionView(dataView);
myListView.ItemsSource = lcv;

Теперь, когда вам нужно удалить какой-либо объект, просто сделайте это:

ListCollectionView lcv = (ListCollectionView) myListView.ItemsSource;
lcv.Remove(myListView.SelectedItem);

А после удаления просто обновите вид:

lcv.Refresh();

or

((ListCollectionView)myListView.ItemsSource).Refresh();
person Yogesh    schedule 26.10.2009

Рассмотрите возможность использования шаблона M-V-VM для разделения понятия удаления элемента из вашего списка объектов данных и НЕПОСРЕДСТВЕННОГО удаления их из вашей текущей реализации пользовательского интерфейса. Этим двоим не нужно знать друг о друге, кроме привязок.

При использовании шаблона MVVM выставляйте логическое свойство «IsSelected» в своей ViewModel.

public class SimpleViewModel : BaseViewModel //For INotifyPropertyChanged, etc
{

      public IList<SimpleBusinessObject> ViewModelItems;

      public SimpleViewModel()
      {
             ViewModelItems = new ObservableList<SimpleBusinessObjectViewModel>();
      }

}

public class SimpleBusinessObjectViewModel
{
      public bool ViewModelIsSelected { get; set; }

      public SimpleBusinessObjectViewModel()
      {
             ViewModelIsSelected = false;
      }
}

Затем в своем представлении попробуйте что-то вроде этого:

<Style TargetType="{x:Type ListViewItem}">
       <Style.Triggers>
               <Setter Property="IsSelected" Value="{Binding ViewModelIsSelected}"
       </Style.Triggers>
</Style>
<ListView ItemsSource={Binding ViewModelItems}>   
       //here you can insert how you want to display a ListViewItem
</ListView>

Это позволит вам добавлять, редактировать и удалять элементы в вашем списке ViewModel — точно так же, как если бы это был настоящий ListView. Отсюда вы также можете проверить IsSelected каждого элемента (который реагирует на взаимодействие мыши с ListView), фактически не проверяя ListViewItem. Это будет гораздо более чистое и ремонтопригодное решение.

person Jimmy Lyke    schedule 07.02.2010
comment
Ваш бизнес-объект знает о вашей ViewModel? Это не очень хорошая идея, поскольку она меняет обычное разделение бизнес-логики и логики представления. - person jpierson; 04.06.2010