为什么我的列表框行为异常?它是追加而不是清除
Why is my listbox behaving unexpectedly? It is appending and not clearing
我没看到什么...我有一个从 ObservableCollection 更新的列表框,该集合被清除,然后向其中添加新数据。
列表框 mmisbehaves 它保留原始集合数据,然后将新数据附加到列表底部,尽管事实上它不在 ObservationalCollection 中。例如。如果它最初在列表框中有 4 个项目,如果我清除 ItemsSource shortTerm 并通过调试器,它确实清除了,然后更新为有 6 个新项目。然后列表框将显示原来的 4 并附加新的 6。它只是继续附加并且从不清除列表框!
这是让我头疼的重要一点:我使用水果编写了一个我想要实现的简化版本。它完美地工作。我不明白如何做同样的事情,我尝试重新创建项目,以防后台隐藏的东西搞砸了。
当他们做同样的事情时,为什么一个人工作而另一个人不行?这让我转弯。
尽管 ObservableCollection 被清除,它仍将数据附加到列表框。我不明白为什么会这样。它正在更新我的列表框,但没有清除以前的数据,我花了几个小时浏览绑定和 INotifyPropertyChanged 并且不断出现相同的结果。
我试图简化,所以我创建了一个非常基本的程序,只需将 3 个水果添加到列表框中,然后按一个按钮清空 "fruit" 并添加 3 个新水果。另一个按钮,清除它并放入原来的 3 个水果。所以在任何时候列表框中只会出现 3 个水果。 (例如苹果、香蕉、橙子或芒果、桃子、菠萝)。
如果我对我的程序执行相同的步骤,我得到的结果是按下按钮会清除 "fruitOC" ObservableCollection,但不会清除列表框并附加到它。
因此,如果 fruitOC 填充了 Apple、Banana、Orange,列表框也是如此,当我按下按钮时,它会清除 fruitOC 并添加 3 种新水果 Mango、Peach、Pineapple。但列表框显示 Apple、Banana、Orange、Mango、Peach、Pineapple。
我不明白这是怎么回事!我看不出它是如何作为有效代码的绑定的,仅引用设置列表框的 ItemsSource 属性 并且它有效。我头疼。我一定是错过了什么,但我一辈子都无法得到它是什么!
我试图从头开始重新创建 Visual Studio 解决方案,以防万一在后台隐藏了一些东西,对于我的程序,它只是不断追加!
// THIS CODE RESULTS IN THE LISTBOX APPENDING:
public ObservableCollection<string> shortTerm {get; set;}
public MainWindow()
{
InitializeComponent();
shortTerm = new ObservableCollection<string>();
listBoxShortTerm.ItemSource = shortTerm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
UpdateShortTerm();
}
private void UpdateShortTerm()
{
shortTerm.Clear(); // this bit works and clears all data
shortTerm.Add("insert string here");
}
// THIS CODE THE LISTBOX WORKS AS EXPECTED:
public partial class MainWindow : Window
{
public ObservableCollection<string> fruit {get ; set;}
public MainWindow()
{
InitializeComponent();
fruit = new ObservableCollection<string>();
AddInitialFruit();
listBoxFruit.ItemsSource = fruit;
}
private void AddInitialFruit()
{
fruit.Clear();
fruit.Add("Apple");
fruit.Add("Banana");
fruit.Add("Orange");
}
private void ChangeFruit()
{
fruit.Clear();
AddNewFruit();
}
private void AddNewFruit()
{
fruit.Add("Mango");
fruit.Add("Peach");
fruit.Add("Pineapple");
}
private void ButtonChangeFruit_Click(object sender, RoutedEventArgs e)
{
ChangeFruit();
}
private void ButtonChangeFruit2_Click(object sender, RoutedEventArgs e)
{
AddInitialFruit();
}
}
}
我只希望列表框只显示我的 ObservableCollection shortTerm 的内容,而不是当前包含的内容以及之前包含的内容。
啊!我不敢相信我从来没有发现这一点,它已经困扰了我好几天了!问题出在后台的数据表上,而不是清除,因此从中获取的要放入列表框中的数据一直在追加,因为数据表一直在追加。
我没看到什么...我有一个从 ObservableCollection 更新的列表框,该集合被清除,然后向其中添加新数据。
列表框 mmisbehaves 它保留原始集合数据,然后将新数据附加到列表底部,尽管事实上它不在 ObservationalCollection 中。例如。如果它最初在列表框中有 4 个项目,如果我清除 ItemsSource shortTerm 并通过调试器,它确实清除了,然后更新为有 6 个新项目。然后列表框将显示原来的 4 并附加新的 6。它只是继续附加并且从不清除列表框!
这是让我头疼的重要一点:我使用水果编写了一个我想要实现的简化版本。它完美地工作。我不明白如何做同样的事情,我尝试重新创建项目,以防后台隐藏的东西搞砸了。
当他们做同样的事情时,为什么一个人工作而另一个人不行?这让我转弯。
尽管 ObservableCollection 被清除,它仍将数据附加到列表框。我不明白为什么会这样。它正在更新我的列表框,但没有清除以前的数据,我花了几个小时浏览绑定和 INotifyPropertyChanged 并且不断出现相同的结果。
我试图简化,所以我创建了一个非常基本的程序,只需将 3 个水果添加到列表框中,然后按一个按钮清空 "fruit" 并添加 3 个新水果。另一个按钮,清除它并放入原来的 3 个水果。所以在任何时候列表框中只会出现 3 个水果。 (例如苹果、香蕉、橙子或芒果、桃子、菠萝)。
如果我对我的程序执行相同的步骤,我得到的结果是按下按钮会清除 "fruitOC" ObservableCollection,但不会清除列表框并附加到它。
因此,如果 fruitOC 填充了 Apple、Banana、Orange,列表框也是如此,当我按下按钮时,它会清除 fruitOC 并添加 3 种新水果 Mango、Peach、Pineapple。但列表框显示 Apple、Banana、Orange、Mango、Peach、Pineapple。
我不明白这是怎么回事!我看不出它是如何作为有效代码的绑定的,仅引用设置列表框的 ItemsSource 属性 并且它有效。我头疼。我一定是错过了什么,但我一辈子都无法得到它是什么!
我试图从头开始重新创建 Visual Studio 解决方案,以防万一在后台隐藏了一些东西,对于我的程序,它只是不断追加!
// THIS CODE RESULTS IN THE LISTBOX APPENDING:
public ObservableCollection<string> shortTerm {get; set;}
public MainWindow()
{
InitializeComponent();
shortTerm = new ObservableCollection<string>();
listBoxShortTerm.ItemSource = shortTerm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
UpdateShortTerm();
}
private void UpdateShortTerm()
{
shortTerm.Clear(); // this bit works and clears all data
shortTerm.Add("insert string here");
}
// THIS CODE THE LISTBOX WORKS AS EXPECTED:
public partial class MainWindow : Window
{
public ObservableCollection<string> fruit {get ; set;}
public MainWindow()
{
InitializeComponent();
fruit = new ObservableCollection<string>();
AddInitialFruit();
listBoxFruit.ItemsSource = fruit;
}
private void AddInitialFruit()
{
fruit.Clear();
fruit.Add("Apple");
fruit.Add("Banana");
fruit.Add("Orange");
}
private void ChangeFruit()
{
fruit.Clear();
AddNewFruit();
}
private void AddNewFruit()
{
fruit.Add("Mango");
fruit.Add("Peach");
fruit.Add("Pineapple");
}
private void ButtonChangeFruit_Click(object sender, RoutedEventArgs e)
{
ChangeFruit();
}
private void ButtonChangeFruit2_Click(object sender, RoutedEventArgs e)
{
AddInitialFruit();
}
}
}
我只希望列表框只显示我的 ObservableCollection shortTerm 的内容,而不是当前包含的内容以及之前包含的内容。
啊!我不敢相信我从来没有发现这一点,它已经困扰了我好几天了!问题出在后台的数据表上,而不是清除,因此从中获取的要放入列表框中的数据一直在追加,因为数据表一直在追加。