2

私の質問が少し漠然としている場合は、事前にお詫び申し上げます。

私は非常に興味深い概念を見つけたreactiveuiを調べて学習しています。そのために、WPF と Prism を使用して小さなアプリケーションを構築していますが、ビュー モデルでコマンドを構築する方法を理解するのに苦労しています。

私は、完全であれば、うまくいけば私のために物事を少し明確にする例を持っています:

いくつかのデータを表示するグリッドが欲しいです。このデータは Web サービスから読み込まれます。私の目標は、ビューがユーザーに表示されたときに 1 回読み込み、x 回ごとに (たとえば、1 分に 1 回)、またはビューのボタンから明示的にトリガーされたときに再読み込みすることです。 .

したがって、私のビューモデルは現在次のようになっています。

public class MyPageViewModel : ReactiveValidatedObject
{
        /// <summary>
        /// Collection of tickets
        /// </summary>
        public ReactiveCollection<TicketModel> Tickets { get { return _Tickets.Value; } }

        /// <summary>
        /// Private store of tickets
        /// </summary>
        private ObservableAsPropertyHelper<ReactiveCollection<TicketModel>> _Tickets { get; set; }

        /// <summary>
        /// The service which retrieves the tickets
        /// </summary>
        private ITicketService _ticketService;

        public MyPageViewModel() : this(null) { }


        public MyPageViewModel(ITicketService ticketService)
        {
            LoadTickets = new ReactiveAsyncCommand(null, 0);
            }

        /// <summary>
        /// A command which exposes the load action for the tickets
        /// </summary>
        public ReactiveAsyncCommand LoadTickets { get; private set; }

        private void loadTickets()
        {
            //returns a List<TicketModel>
            var tickets = _ticketService.GetTickets();
        }
}

私の質問は次のとおりです。

1) x 回ごとに起動され、チケット ストレージをリロードする内部の loadTickets 関数を呼び出す非同期コマンドを登録するにはどうすればよいですか? このコマンドは、公開されたコマンド LoadTickets によっても起動されます。

2) 関数内で、loadTickets サービスからリストを取得するたびに取得します。このリストを UI に公開される ReactiveCollection に変換するにはどうすればよいですか。

4

1 に答える 1

1

1)x回ごとに起動され、チケットストレージをリロードする内部loadTickets関数を呼び出す非同期コマンドを登録するにはどうすればよいですか?このコマンドは、公開されたコマンドLoadTicketsによっても実行されます。

Observable.Timer(TimeSpan.FromSeconds(10), RxApp.DeferredScheduler)
    .InvokeCommand(LoadTickets);

2)関数では、loadTicketsサービスからリストを取得するたびに取得します。このリストをUIに公開されるReactiveCollectionに変換するにはどうすればよいですか。

// This makes it so when you invoke LoadTickets.Execute, Tickets
// gets updated.
// NB: Make loadTickets return a List<Ticket>
LoadTickets.RegisterAsyncFunc(x => loadTickets())
    .Select(x => new ReactiveCollection<Ticket>(x))
    .ToProperty(this, x => x.Tickets);
于 2012-12-13T02:14:40.380 に答える