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 プロパティを必要とする場合があることです。右上の狙撃でどのようにアクセスできますか?

編集

可能であれば、このラムダ式にパラメーターを渡したくありません。この Id が必要ない場合があるからです。これが正しい方法である場合は、オプションのパラメーターで問題ありません。

PS

これは質問にとって重要ではありませんが、不必要な議論を避けるために、このダイアログは telerik の RadWindow に基づいています。

4

1 に答える 1

0

Actionはパラメーターを持たず、値を返さないメソッドであるため、Action デリゲートを作成するときに OptionObject.ID プロパティを囲む必要あります

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

または、Henkがコメントで示唆しているように、つまり、入力パラメーターを持つアクションを作成します。

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

囲まれた変数への変更は、参照型を扱う場合にのみ適切に機能することに注意してください。

于 2012-08-13T01:52:11.403 に答える