【问题标题】:How to delete a ListViewItem when bound to a DataView绑定到 DataView 时如何删除 ListViewItem
【发布时间】:2009-10-24 07:35:39
【问题描述】:

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

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

【问题讨论】:

    标签: wpf listview dataset dataview listviewitem


    【解决方案1】:

    当您将集合绑定到列表视图时,请使用 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();
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您的业务对象知道您的 ViewModel 吗?这不是一个好主意,因为它颠倒了业务逻辑和表示逻辑的正常分离。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多