2011-10-26 104 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 
}