【发布时间】:2019-07-30 11:27:17
【问题描述】:
我看不到某些东西...我有一个列表框,它从 ObservableCollection 更新该集合被清除,然后将新数据添加到其中。
列表框 mms 行为它保留原始集合数据,然后将新数据附加到列表底部,尽管它不在 ObservationalCollection 中。例如。如果它最初在 listBox 中有 4 个项目,如果我清除 ItemsSource shortTerm 并遍历调试器,它确实会清除,然后更新为有 6 个新项目。然后列表框将显示原来的 4 并追加新的 6。它只是继续追加并且永远不会清除列表框!
这是让我头疼的重要一点:我用水果写了一个我想要实现的简化版本。而且效果很好。我不明白如何做同样的事情,我尝试重新创建项目,以防后台隐藏的东西搞砸了。
当他们做同样的事情时,为什么一个工作而不是另一个工作?这让我在拐弯处。
尽管 ObservableCollection 已被清除,但它仍将数据附加到列表框。我不明白为什么会这样。它正在更新我的列表框,但没有清除以前的数据,我花了几个小时浏览绑定和 INotifyPropertyChanged,并且不断出现相同的结果。
我试图简化,所以我创建了一个非常基本的程序,它只是将 3 块水果添加到列表框中,然后按一个按钮清空“水果”并添加 3 块新的。另一个按钮,清除它并放入原来的3片水果。所以任何时候只有 3 件水果出现在列表框中。 (例如苹果、香蕉、橙子或芒果、桃子、菠萝)。
如果我对我的程序使用相同的步骤,我得到的结果是按下按钮会清除“fruitOC”ObservableCollection,但不会清除列表框并附加到它。
因此,如果fruitOC 填充了Apple、Banana、Orange,那么列表框也是如此,并且我按下按钮,它会清除fruitOC 并添加3 个新水果Mango、Peach、Pineapple。但列表框显示 Apple、Banana、Orange、Mango、Peach、Pineapple。
我不明白这是怎么回事!我看不出它如何将绑定作为有效的代码,仅引用设置 listBox 的 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 的内容,而不是当前包含的内容以及之前包含的内容。
【问题讨论】:
-
我无法重现您遇到的问题。发布的代码按预期工作。试着找出你真实代码的不同之处。
-
我能看到的唯一区别是“shortTerm”转到另一个过程来填充并返回。如果我尝试在一个过程中创建一个新的 ObservableCollection 并返回它,例如短期 = CreateAndPopulateNewOC();它会导致 listBox 变为空白并保持这种状态。
-
我尝试了其他方法,例如使用数据创建新的 OC,例如newListData = CreateAndPopulateNewOC();然后尝试 shortTerm.Clear();然后 foreach(newListData 中的字符串 s) { shortTerm.Add(s) };这只是重新创建了不断附加的问题。更糟糕的是,我将水果代码添加到我的程序中,并在我用来更新程序的相同按钮中运行它,它会按预期运行,但我的程序的原始代码仍然意味着 listBox 只是在附加。跨度>
-
我也尝试过创建一个新的列表框并重新填充它。例如列表框 = 创建列表框(短期);私有 ListBox CreateListBox(ObservableCollection o) { ListBox l = new ListBox(); l.ItemSource = o;返回 l;这样做只是在按下按钮后留下一个空的列表框。
-
你能发布一个完整的程序来复制你的问题吗?