2

如果我的问题有点含糊,我提前道歉。

我正在研究和学习反应式,我发现了一个非常有趣的概念。为此,我正在使用 WPF 和 Prism 构建一个小型应用程序,但我在理解视图模型中构建命令的方式时遇到了一些困难。

我有一个例子,如果完整的话,希望能为我澄清一点:

我想要一个显示一些数据的网格。此数据是从 Web 服务加载的,我的目标是在向用户显示视图时加载一次,然后每 x 次(例如每分钟一次)或从视图中的按钮显式触发时重新加载它.

所以,我的视图模型目前看起来像:

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 函数来重新加载 Ticket 存储?此命令也将由公开的命令 LoadTickets 触发。

2)在函数中,loadTickets我每次都会从服务中获取一个List。如何将此列表转换为向 UI 公开的 ReactiveCollection。

4

1 回答 1

1

1) 如何注册一个异步命令,该命令将每 x 次触发一次,并调用内部 loadTickets 函数来重新加载 Ticket 存储?此命令也将由公开的命令 LoadTickets 触发。

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

2)在函数中,loadTickets我每次都会从服务中获取一个List。如何将此列表转换为向 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 回答