Мы использовали lamda-события, подобные этому:
bookMarkClient.wmdeleteCompleted += (s, ea) =>
{
if (ea.Result = "Success")
{
foreach (BookMark bookMark in BookMarks)
{
if (bookMarkId == bookMark.bm_id)
{
BookMarks.Remove(bookMark);
OnNotifyPropertyChanged("BookMarks");
break;
}
}
}
};
bookMarkClient.wmdeleteBookMarkAsync(bookMarkId);
Однако, согласно многим ответам на stackoverflow, они не могут быть удалены, так что, если я вызову этот код снова, мое событие будет запущено дважды. Поэтому я хочу удалить лямбда-код и сделать это:
//in the class constructor
bookMarkClient.wmdeleteBookMarkCompleted += new EventHandler<wmdeleteBookMarkCompletedEventArgs>(bookMarkClient_wmdeleteBookMarkCompleted);
//Proc on the same class
void bookMarkClient_wmdeleteBookMarkCompleted(object sender, wmdeleteBookMarkCompletedEventArgs e)
{
if (ea.Result = "Success")
{
foreach (BookMark bookMark in BookMarks)
{
if (bookMarkId == bookMark.bm_id)
{
BookMarks.Remove(bookMark);
OnNotifyPropertyChanged("BookMarks");
break;
}
}
}
}
//on button click
bookMarkClient.wmdeleteBookMarkAsync(bookMarkId);
ОДНАКО: переменная bookMarkId больше не доступна. Я понимаю, что это потому, что лямбда-событие копирует переменную в созданный класс и поддерживает ее в течение всего события. Так как мне сделать то же самое?
Я пытался установить приватную переменную, но покажите, что это можно изменить до получения обратного вызова! Это также относится к коллекции под названием Закладки.
Примечание. Это клиент Silverlight, и я бы предпочел не возвращать коллекцию идентификаторов / идентификаторов в аргументах событий, поскольку это означало бы переработку большого количества кода wcf.
Большое спасибо, Мэтт
ps первый пост в стек, так что успокойся со мной ...