2009-10-24 30 views
1

當ItemsSource設置爲DataView時,如何從WPF ListView中刪除選定的ListViewItem?我可以得到所選的ListViewItem,然後如何刪除DataView中的實際行?如何刪除綁定到DataView時的ListViewItem

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

回答

2

當您將集合綁定到列表視圖時,請使用ListCollectionView而不是DataView。可以這樣輕鬆完成(其中數據視圖的類型數據視圖的):

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

現在,當您需要刪除任何對象,只是這樣做:

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

和刪除後,只需刷新視圖:

lcv.Refresh(); 

((ListCollectionView)myListView.ItemsSource).Refresh(); 
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> 

這將讓你添加,編輯和刪除項目在您的視圖模型的列表 - 就像如果它是實際的ListView。從這裏,您還可以檢查每個項目的IsSelected(響應鼠標與ListView的交互),而不實際檢查ListViewItem。這將是一個更清潔,可維護的解決方案。

+0

您的業務對象知道您的ViewModel?這不是一個好主意,因爲它顛倒了業務邏輯和表示邏輯的正常分離。 – jpierson 2010-06-04 14:59:39

+0

偉大的一點。我會更新我的例子。 – 2010-06-22 23:05:00