Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 写委派方法存在问题_C# 4.0_Delegates_Action_Handler - Fatal编程技术网

C# 4.0 写委派方法存在问题

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;

我在向EventHandler添加参数时遇到问题。 当用户选择消息并选择要向谁发送消息时,我有一个控件

我需要处理程序OnConfirmForwarClosed以某种方式添加变量项

我怎么做

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.
        }
    }
}
等等,等等