Проблема с записью делегированного метода - PullRequest
0 голосов
/ 27 сентября 2011

У меня проблема с добавлением параметров в EventHandler.У меня есть элемент управления, когда пользователь выбирает сообщение и выбирает, кому он хочет его отправить.

Мне нужно обработчику OnConfirmForwarClosed добавить каким-либо образом переменную item.

Как я могу это сделать?

private void inboxContextMenu_ItemClick(object sender, Telerik.Windows.RadRoutedEventArgs e)
        {
            var item = (RadMenuItem)e.Source;
            RadWindow.Confirm("Do you want forward this message to item.DataContext.HandlerName ?", OnConfirmForwarClosed);


        }

        private void OnConfirmForwarClosed(object sender, WindowClosedEventArgs e)
        {
            if (e.DialogResult == true)
            {
         //here I need item from caller
            }
        }

РЕДАКТИРОВАТЬ Мне нужен результат, который я могу получить с помощью этого решения:

 RadWindow.Confirm("Do you want forward this message to item.DataContext.HandlerName ?",(s,ea)=>
                                         {
                                             if(ea.DialogResult==true)
                                             {
                                                 MessageBox.Show((item.DataContext as Handler).HandlerId.ToString());
                                             }
                                         });

1 Ответ

1 голос
/ 05 октября 2011

Если я правильно понимаю ваш вопрос, вы не хотите «поднимать» локальную переменную в лямбду, например ...

void inboxContextMenu_ItemClick(object sender, Telerik.Windows.RadRoutedEventArgs e) {
    var item = (RadMenuItem)e.Source;
    RadWindow.Confirm(
        "Do you want forward this message to item.DataContext.HandlerName ?",
        (sender, e) => {
            if (e.DialogResult == true) {
                // You can use 'item' here directly.
            }
        }
    );
}

... и вместо этого вы хотите оставить OnConfirmForwarClosed (предположительно, чтобы подписаться на события, не показанные здесь). Если это правильно, то у вас есть несколько вариантов:

1

Вы можете просто расположить ваши методы по-другому:

void inboxContextMenu_ItemClick(object sender, Telerik.Windows.RadRoutedEventArgs e) {
    var item = (RadMenuItem)e.Source;
    RadWindow.Confirm(
        "Do you want forward this message to item.DataContext.HandlerName ?",
        (sender, e) => OnConfirmForwarClosedImp(sender, e, item)
    );
}

void OnConfirmForwarClosedImp(object sender, WindowClosedEventArgs e, RadMenuItem item) {
    if (e.DialogResult == true) {
        if (item != null) {
            // Use 'item'.
        }
        else {
            // OnConfirmForwarClosed was called from somewhere else.
        }
    }
}

void OnConfirmForwarClosed(object sender, WindowClosedEventArgs e) {
    OnConfirmForwarClosedImp(sender, e, null);
}

2

Установить поле объекта:

void inboxContextMenu_ItemClick(object sender, Telerik.Windows.RadRoutedEventArgs e) {
    item = (RadMenuItem)e.Source;
    try {
        RadWindow.Confirm(
            "Do you want forward this message to item.DataContext.HandlerName ?",
            OnConfirmForwarClosed
        );
    }
    finally {
        item = null;
    }
}

RadMenuItem item = (RadMenuItem)e.Source;

void OnConfirmForwarClosed(object sender, WindowClosedEventArgs e) {
    if (e.DialogResult == true) {
        if (item != null) {
            // Use 'this.item'.
        }
        else {
            // OnConfirmForwarClosed was called from somewhere else.
        }
    }
}

3.

Выберите один из существующих OnConfirmForwarClosed параметров:

void inboxContextMenu_ItemClick(object sender, Telerik.Windows.RadRoutedEventArgs e) {
    var item = (RadMenuItem)e.Source;
    RadWindow.Confirm(
        "Do you want forward this message to item.DataContext.HandlerName ?",
        (sender, e) => OnConfirmForwarClosed(item, e)
    );
}

void OnConfirmForwarClosed(object sender, WindowClosedEventArgs e) {
    if (e.DialogResult == true) {
        var item = sender as RadMenuItem;
        if (item != null) {
            // Use 'item'.
        }
        else {
            // OnConfirmForwarClosed was called from somewhere else.
        }
    }
}

и т. Д. И т. Д. *

...