绑定到DataView时如何删除ListViewItem

时间:2009-10-24 07:35:39

标签: wpf listview dataset dataview listviewitem

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

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

2 个答案:

答案 0 :(得分:2)

将集合绑定到列表视图时,请使用ListCollectionView而不是DataView。可以像这样轻松完成(其中dataView的类型为DataView):

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

现在,当您需要删除任何对象时,只需执行以下操作:

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

删除后,只需刷新视图:

lcv.Refresh();

((ListCollectionView)myListView.ItemsSource).Refresh();

答案 1 :(得分:0)

考虑使用M-V-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。这将是一个更清洁,可维护的解决方案。