C# 4.0 写委派方法存在问题
我在向EventHandler添加参数时遇到问题。 当用户选择消息并选择要向谁发送消息时,我有一个控件 我需要处理程序OnConfirmForwarClosed以某种方式添加变量项 我怎么做C# 4.0 写委派方法存在问题,c#-4.0,delegates,action,handler,C# 4.0,Delegates,Action,Handler,我在向EventHandler添加参数时遇到问题。 当用户选择消息并选择要向谁发送消息时,我有一个控件 我需要处理程序OnConfirmForwarClosed以某种方式添加变量项 我怎么做 private void inboxContextMenu_ItemClick(object sender, Telerik.Windows.RadRoutedEventArgs e) { var item = (RadMenuItem)e.Source;
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());
}
});
如果我正确理解了您的问题,您就不会希望将局部变量“提升”到lambda中,例如
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.
}
}
}
等等,等等