2011-10-26 102 views
1

我有一個顯示給用戶的項目集合。WPF刪除列表框項目

雙擊特定項目後,我想從列表中刪除此項目。

我已經完成了這種方式,我不喜歡這樣修改數據源,而不僅僅是列表中的項目。我也意識到,如果我有1000條記錄,刷新將會非常緩慢。

這裏有一些更好的方式從列表框中刪除項目?
我不想修改數據源,因爲我也將其用於歷史。

僞數據組了:從列表中刪除

private void SetUpData() 
    { 
     this.users = new List<UserNames>(); 
     this.users.Add(new UserNames() {Id = 1, UserName = "name 1"}); 
     this.users.Add(new UserNames() { Id = 2, UserName = "name 2" }); 
     this.users.Add(new UserNames() { Id = 3, UserName = "name 3" }); 
     this.users.Add(new UserNames() { Id = 4, UserName = "name 4" }); 
     this.users.Add(new UserNames() { Id = 5, UserName = "name 5" }); 
     this.users.Add(new UserNames() { Id = 6, UserName = "name 6" }); 
     this.users.Add(new UserNames() { Id = 7, UserName = "name 7" }); 
     this.users.Add(new UserNames() { Id = 8, UserName = "name 8" }); 
     this.users.Add(new UserNames() { Id = 9, UserName = "name 9" }); 
     this.users.Add(new UserNames() { Id = 10, UserName = "name 10" }); 
     this.listBox1.DataContext = users; 
    } 

我的項目的方法。

private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     UserNames itemToRemove = (UserNames)((ListBox)sender).SelectedItem; 
     MessageBox.Show(itemToRemove.UserName); 
     this.listBox1.DataContext = null; 

     this.users.Remove(itemToRemove); // remove from list 
     this.listBox1.DataContext = this.users; // update data source 
    } 

我的列表框的定義:

<ListBox Grid.Column="1" Grid.Row="1" Name="listBox1" ItemsSource="{Binding}" SelectedValuePath="Id" MouseDoubleClick="listBox1_MouseDoubleClick"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Label Content="{Binding UserName}" /> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

回答

1

更好地利用MVVM的做法,並結合您的listbox.itemssourceobservableCollection<UserNames>類型的property

這樣一來,通過從該observableCollection項目,該項目將被從listbox移除,用戶界面將自動更新。

這個例子顯示PersonList binding to a listbox,它可以爲你有用。

1

MVVM是推薦的模式,但對於您的問題的答案不是必需的。

  1. 執行INotifyPropertyChanged
  2. 您的列表<>更改爲一個ObservableCollection <>的規定

有關刷新速度緩慢的另一個問題 - 你也可以使用設置你的列表框使用虛擬化等等只有屏幕上的項目被繪製而不是整個框。

0

MVVM建議,但是這應該爲你工作:

private void SetUpData()//call this just once 
{ 
    this.users = new ObservableCollection<UserNames>(); 
    this.users.Add(new UserNames() {Id = 1, UserName = "name 1"}); 
    this.users.Add(new UserNames() { Id = 2, UserName = "name 2" }); 
    this.users.Add(new UserNames() { Id = 3, UserName = "name 3" }); 
    this.users.Add(new UserNames() { Id = 4, UserName = "name 4" }); 
    this.users.Add(new UserNames() { Id = 5, UserName = "name 5" }); 
    this.users.Add(new UserNames() { Id = 6, UserName = "name 6" }); 
    this.users.Add(new UserNames() { Id = 7, UserName = "name 7" }); 
    this.users.Add(new UserNames() { Id = 8, UserName = "name 8" }); 
    this.users.Add(new UserNames() { Id = 9, UserName = "name 9" }); 
    this.users.Add(new UserNames() { Id = 10, UserName = "name 10" }); 
    this.listBox1.DataContext = users; 
} 


private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    UserNames itemToRemove = (UserNames)((ListBox)sender).SelectedItem; 
    MessageBox.Show(itemToRemove.UserName); 

    this.users.Remove(itemToRemove); // remove from list 
}