2012-12-12 121 views
2

如果我的問題有點含糊,我很抱歉。Reactiveui命令綁定

我正在研究和學習,我發現一個非常有趣的概念。爲此,我正在使用WPF和Prism構建一個小型應用程序,並且我在理解視圖模型中構建命令的方式方面存在一些困難。

我有,如果完成,將有望澄清事情我一點點的例子:

我想有一個顯示一些數據的網格。這些數據是從Web服務加載的,我的目標是在向用戶顯示視圖時再加載一次,然後每隔一次(例如每分鐘一次)重新加載它,或者在View中的按鈕顯式觸發時加載它。

所以,我的視圖模型目前是這樣的:

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次發射,將調用內部lo​​adTickets異步命令函數將重新加載Ticket存儲?這個命令也會被暴露的命令LoadTickets觸發。

2)在函數中,loadTickets我將每次從服務中獲取List。如何將此列表轉換爲暴露給UI的ReactiveCollection。

回答

1

1)如何註冊一個異步命令,每隔x次觸發一次,並調用將重新加載Ticket存儲的內部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); 
+0

感謝您的信息。問題1完美地工作。對於問題2:由於loadTickets()函數返回列表,因此如何將loadTickets()的結果轉換爲ReactiveCollection 。如果我理解正確,每次調用LoadTickets時,ToProperty方法將獲取loadTickets()的輸出,並將其放入Tickets屬性中。 – sTodorov

+0

如果你永遠不會改變票的內容(即你只會替換整個東西),你實際上不需要使用'ReactiveCollection',只需使用'List'。否則,我爲你更新了答案 –

+0

非常感謝。我會試試看 – sTodorov