2012-08-12 75 views
0

我正在创建自定义对话框类。它在构造函数中使用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属性。我怎样才能在上面狙击的权利访问它?

编辑

我不希望任何参数传递到这个lambda表达式,如果有可能,因为有时没有必要为这个ID。如果这是正确的选择,可选参数将会很好。

PS

这并不重要,但问题来避免这种对话是基于Telerik的RadWindow不必要的讨论。

+0

'Action '会起作用吗?然后'x.Action(x)'。 – 2012-08-12 22:04:10

回答

0

一个Action是没有参数和不返回值的方法,所以你要么必须附上OptionObject.ID属性,当您创建行动代表:

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

或者不喜欢亨克表明在他的评论,即创建一个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打交道时才能正常工作。