为什么我的事件处理程序触发两次?

Has*_*eeb 3 c# event-handling windows-phone-7

嘿家伙我有一个艰难的时间试图解决这个问题我已经在3小时仍然无法找出为什么它这样做...这里是代码

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.");
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我第一次完美地改变类别时...完美地说我的意思是它调用函数GetItemsAsync(selectedCategoryId)并获取结果并调用事件处理程序client_GetItemsCompleted()并且事件处理程序的内部工作按照预期工作,它设置使用正确的数据列出并在列表框中显示itemNumber和itemName ...但是当我再次更改类别以获取不同的项目时它无法正常工作,它正在做的是清除列表并填充列表因为它应该运行for循环并填充所调用的listBox Items但由于某种原因它再次进入函数的顶部并清空所有列表:/ ...请告诉我为什么它再次执行该函数..并且当我再次选择另一个类别时,它会执行3次事件处理程序,然后执行4次等等.任何人都知道为什么要这样做?我需要这个修复我的项目:(

Mag*_*son 13

每次执行此操作:

  client.GetItemsCompleted += 
Run Code Online (Sandbox Code Playgroud)

您为该事件添加了一个订阅者,因此第二次它将触发两次(第三次三次,等等).

在完成的方法中要么unsubscrice( - =):

void client_GetItemsCompleted(object sender, GetItemsCompletedEventArgs e)
{
    try {
       /* .... */
    }
    finally {
        client.GetItemsCompleted -= 
            new EventHandler<GetItemsCompletedEventArgs>(client_GetItemsCompleted);
    }
}
Run Code Online (Sandbox Code Playgroud)

或在每次调用之前启动客户端对象.

var client = new ...();
client.GetItemsAsync(selectedCategoryId);
client.GetItemsCompleted += 
            new EventHandler<GetItemsCompletedEventArgs>(client_GetItemsCompleted);
Run Code Online (Sandbox Code Playgroud)