如果我的问题有点含糊,我会提前道歉。
我正在研究和学习一些我觉得非常有趣的概念。为此,我正在使用WPF和Prism构建一个小应用程序,我在理解视图模型中构建命令的方式时遇到了一些困难。
我有一个例子,如果完整的话,希望能为我澄清一些事情:
我想要一个显示一些数据的网格。这个数据是从Web服务加载的,我的目标是在向用户显示视图时加载一次,然后每隔x次重新加载一次(例如,每分钟一次)或者从视图中的按钮显式触发
所以,我的View Model目前看起来像:
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次触发的异步命令,并调用将重新加载Ticket存储的内部loadTickets函数?暴露的命令LoadTickets也将触发此命令。
2)在函数中,每次从服务中获取List时,我都会获取loadTickets。如何将此列表转换为暴露给UI的ReactiveCollection。
答案 0 :(得分:1)
1)如何注册每x次触发的异步命令,并调用将重新加载Ticket存储的内部loadTickets函数?暴露的命令LoadTickets也将触发此命令。
Observable.Timer(TimeSpan.FromSeconds(10), RxApp.DeferredScheduler)
.InvokeCommand(LoadTickets);
2)在函数中,每次从服务中获取List时,我都会获取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);