WPF删除列表框项

WPF删除列表框项,wpf,Wpf,我向用户显示了一组项目 双击特定项目后,我想从列表中删除此项目 我不喜欢这样做,因为这样可以修改数据源,而不仅仅是列表中的项目。我还意识到,如果我有大约1000条记录,刷新将非常缓慢 以下是从列表框中删除项目的更好方法吗? 我不想修改数据源,因为我也要将其用于历史记录。 虚拟数据设置: private void SetUpData() { this.users = new List<UserNames>(); this.users.Ad

我向用户显示了一组项目

双击特定项目后,我想从列表中删除此项目

我不喜欢这样做,因为这样可以修改数据源,而不仅仅是列表中的项目。我还意识到,如果我有大约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;
    }
我的列表框定义:

<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>

最好使用MVVM方法,并将您的
列表框.itemssource
绑定到类型为
observableCollection
属性

这样,通过从
可观察集合
中删除项目,该项目将从
列表框
中删除,UI将自动更新


此示例显示了一个,它对您很有用。

MVVM是推荐的模式,但不是回答您的问题所必需的

  • 实现INotifyPropertyChanged
  • 将您的列表更改为所述的可观察集合

  • 对于刷新速度慢的另一个问题,您还可以使用设置listbox以使用虚拟化,这样只绘制屏幕上的项目,而不是整个框

    建议使用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
    }
    
    private void SetUpData()//只调用一次
    {
    this.users=新的ObservableCollection();
    this.users.Add(新用户名(){Id=1,UserName=“name 1”});
    this.users.Add(新用户名(){Id=2,UserName=“name 2”});
    this.users.Add(新用户名(){Id=3,UserName=“name 3”});
    this.users.Add(新用户名(){Id=4,UserName=“name 4”});
    this.users.Add(新用户名(){Id=5,UserName=“name 5”});
    this.users.Add(新用户名(){Id=6,UserName=“name 6”});
    this.users.Add(新用户名(){Id=7,UserName=“name 7”});
    this.users.Add(新用户名(){Id=8,UserName=“name 8”});
    this.users.Add(新用户名(){Id=9,UserName=“name 9”});
    this.users.Add(新用户名(){Id=10,UserName=“name 10”});
    this.listBox1.DataContext=用户;
    }
    私有无效列表框1u鼠标双击(对象发送器,鼠标按钮ventargs e)
    {
    UserNames itemToRemove=(用户名)((列表框)发件人);
    MessageBox.Show(itemToRemove.UserName);
    this.users.Remove(itemToRemove);//从列表中删除
    }
    
    如何不更改集合,而是删除显示的项目,如下所示:

    IEditableCollectionView items = tabControl.Items; //Cast to interface
    if (items.CanRemove)
    {
        items.Remove(tabControl.SelectedItem);
    }
    
    谢谢你的帮助。 我在这里找到了:

    IEditableCollectionView items = tabControl.Items; //Cast to interface
    if (items.CanRemove)
    {
        items.Remove(tabControl.SelectedItem);
    }