private void Catagory_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
int selectedCategoryId = categoryIdList[categoryListBox.SelectedIndex];
client.GetItemsAsync(selectedCategoryId);
client.GetItemsCompleted +=
new EventHandler<GetItemsCompletedEventArgs>(client_GetItemsCompleted);
}
void client_GetItemsCompleted(object sender, GetItemsCompletedEventArgs e)
{
itemIdList.Clear();
itemNameList.Clear();
itemNumberList.Clear();
itemDisplayList.Clear(); //Clears the Display List Items
if (e.Error == null)
{
itemIdList = e.ItemIDList;
itemNumberList = e.itemNumber;
itemNameList = e.Result;
for (int i = 0; i < itemIdList.Count; i++)
{
itemDisplayList.Add(new ItemDisplay { itemNumber = itemNumberList[i], itemName = itemNameList[i] });
}
//Populating the listbox controll with the itemDisplaylist...
Items.ItemsSource = itemDisplayList;
}
else
{
MessageBox.Show("Problem in getting the items list.");
}
}
当我第一次完美地改变类别时...完美地说我的意思是它调用函数GetItemsAsync(selectedCategoryId)
并抓取结果并调用事件处理程序client_GetItemsCompleted()
和内部工作事件处理程序按预期工作,它使用正确的数据设置列表并在列表框中显示itemNumber和itemName ...但是当我再次更改类别以获取不同的项目时,它无法正常工作,它正在做的是它清除列表并按预期填充列表,运行for循环并填充名为Items
的listBox但由于某种原因它再次进入函数顶部并清空所有列表:/ ...请告诉我为什么它再次执行该功能..当我再次选择另一个类别时,它执行事件处理程序3次,然后执行4次等等..任何人都知道为什么这样做?我需要为我的项目修复此问题:(
答案 0 :(得分:12)
每次执行此操作:
client.GetItemsCompleted +=
您为活动添加了订阅者,因此第二次会发生两次(第三次三次等等)。
完成的方法中的unsubscrice( - =):
void client_GetItemsCompleted(object sender, GetItemsCompletedEventArgs e)
{
try {
/* .... */
}
finally {
client.GetItemsCompleted -=
new EventHandler<GetItemsCompletedEventArgs>(client_GetItemsCompleted);
}
}
或在每次通话前启动客户端对象。
var client = new ...();
client.GetItemsAsync(selectedCategoryId);
client.GetItemsCompleted +=
new EventHandler<GetItemsCompletedEventArgs>(client_GetItemsCompleted);