通过作为参数传递的委托操纵对象的字段

时间:2012-08-12 21:33:19

标签: c# windows-phone-7

我正在创建一个自定义对话框类。它在构造函数中获取OptionObject对象的列表。在某些时候它会显示,并且取决于用户单击的选项执行注入OptionObject的操作。

public class OptionObject
    {
        public object Id { get; set; }
        public string Text { get; set; }

        public Action Action { get; set; }

        public OptionObject(object id, string text, Action action)
        {
            this.Id = id;
            this.Text = text;
            this.Action = action;
        } 
}

这是DialogWindow调用操作的方式:

this.Options.Tap += (sender, args) =>   // Options is a ListBox
                                    {
                                        var o = sender as ListBox;
                                        var x = o.SelectedItem as OptionObject;
                                        if(x!=null)
                                            x.Action();
                                        this.IsOpen = false;
                                    };

最后我试图在另一页上使用我的对话框:

foreach (var o in eventsOnDate)
                {
                    chooseEventDialogWindow.Data.OptionsList.Add(new OptionObject(o.Text, ()=> /*### don't know what to put in here ###*/ ));
                }

问题是OptionObject.Action有时需要OptionObject.Id属性。如何在上面的sniped中访问它?

修改

如果可能的话,我不想将任何参数传递给这个lambda表达式,因为有时候不需要这个Id。如果这是正确的方法,可选参数就可以了。

PS

这对于这个问题并不重要,但为了避免不必要的讨论,这个对话框基于telerik的RadWindow。

1 个答案:

答案 0 :(得分:0)

Action是一种没有参数且不返回值的方法,因此您在创建操作<时必须包含 OptionObject.ID 属性/ strong>委托:

object id = new object();
Action act = () => DoSomethingWithIdAndReturnVoid(id);
OptionObject opt = new OptionObject(id, "some text", act);
opt.Action();

或者像 Henk 在他的评论中建议,即创建一个Action that has an input parameter

object id = new object();
Action<object> act = (x) => DoSomethingWithIdAndReturnVoid(x);
OptionObject opt = new OptionObject(id, "some text", act);
opt.Action(opt.ID);

请注意,在处理Reference Types时,对封闭变量的更改才能正常工作。