1

当 ItemsSource 设置为 DataView 时,如何从 WPF ListView 中删除选定的 ListViewItem?我可以获得被选中的 ListViewItem,然后如何删除 DataView 中的实际行?

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

2 回答 2

2

When you bind your collection to the listview, use ListCollectionView instead of DataView. Can be easily done like this (where dataView is of type DataView):

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

Now when you need to delete any object, just do this:

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

And after deleting, just refresh the view:

lcv.Refresh();

or

((ListCollectionView)myListView.ItemsSource).Refresh();
于 2009-10-26T05:32:30.857 回答
0

考虑使用 MV-VM 模式来区分从数据对象列表中删除项目和直接从当前 UI 实现中删除它们的概念。两人不需要互相了解,除了Bindings。

当您使用 MVVM 模式时,请在您的 ViewModel 中公开一个布尔“IsSelected”属性。

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。这将是一个更清洁、可维护的解决方案。

于 2010-02-07T14:34:35.773 回答