2016-10-19 62 views
0

最近幾個小時我試圖解決一個問題,我如何更新ObservableCollection中的現有值。我會在這裏解釋我想要做的一些例子。ReactiveUI如何更新現有值的ReactiveList

正在加載到Xamarin.Froms ListView中的ObservableCollection。

ObservableCollection<SearchResult> _searchResults; 
    public ObservableCollection<SearchResult> SearchResults 
    { 
     get { return _searchResults; } 
     private set { this.RaiseAndSetIfChanged(ref _searchResults, value); } 
    } 

    ReactiveCommand<List<SearchResult>> _search; 
    public ReactiveCommand<List<SearchResult>> Search 
    { 
     get { return _search; } 
     private set { this.RaiseAndSetIfChanged(ref _search, value); } 
    } 

而這是在ObservableCollection中加載的ReactiveObject。當第一次加載列表時,AvaText和PerText爲空,因爲數據還沒有。所以我想迭代列表,並用AvaText和PerText的正確值更新每個SearchObject,並獲取需要用另一個API調用更新的數據。什麼是最好的方式來做到這一點?任何人都可以幫助我向正確的方向展示我嗎?這將是非常讚賞:)

 public class SearchResult : ReactiveObject 
    { 

     string _displayText; 

     public string DisplayText 
     { 
      get { return _displayText; } 
      set { this.RaiseAndSetIfChanged(ref _displayText, value); } 
     } 

     string _IdText; 

     public string IdText 
     { 
      get { return _IdText; } 
      set { this.RaiseAndSetIfChanged(ref _IdText, value); } 
     } 

     string _avaText; 

     public string AvaText 
     { 
      get { return _avaText; } 
      set { this.RaiseAndSetIfChanged(ref _avaText, value); } 
     } 

     string _perText; 

     public string PerText 
     { 
      get { return _perText; } 
      set { this.RaiseAndSetIfChanged(ref _perText, value); } 
     } 
    } 

我已經調查ReactiveUI的文件,我認爲我應該做.ToProperty什麼?

謝謝您的閱讀。

親切的問候,

費爾南多

回答

1

我只注意到你的搜索ReactiveCommand。這可能也需要改變。看看我的LoadStatsImp函數如何執行SearchImp函數。也許類似。

ObservableAsPropertyHelper<ObservableCollection<SearchResult>> _searchResults; 
public ObservableCollection<SearchResult> SearchResults => _searchResults; 

public ReactiveCommand<ObservableCollection<SearchResult>> Search { get; protected set; } 

public TheClassTheseAreIn 
{  
    Search = ReactiveCommand.CreateAsyncTask(parameter => SearchImp(this.SearchCriteria)); 

    _searchResults = Search.ToProperty(this, x => x.SearchResults, new ObservableCollection<SearchResult>); 
} 

我相信可以從SearchResult類中調用您對AvaText和PerText的更新。

我假設AvaText和PerText是隻讀的,在這種情況下,我會使用ObservableAsPropertyHelper爲AvaText和PerText,而不是現在的RaiseAndSetIfChanged實現。 SearchResult類將查找其IdText進行更改,然後它將調用LoadStats ReactiveCommand。 LoadStats使用ToProperty來更新AvaText和PerText。

這其中大部分來自example code at docs.reactiveui.net

public class SearchResult : ReactiveObject 
{ 
    string _displayText; 

    public string DisplayText 
    { 
     get { return _displayText; } 
     set { this.RaiseAndSetIfChanged(ref _displayText, value); } 
    } 

    string _IdText; 

    public string IdText 
    { 
     get { return _IdText; } 
     set { this.RaiseAndSetIfChanged(ref _IdText, value); } 
    } 

    ObservableAsPropertyHelper<string> _avaText; 
    public string AvaText => _avaText.Value; 

    ObservableAsPropertyHelper<string> _perText; 
    public string PerText => _perText.Value; 

    public ReactiveCommand<StatsClass> LoadStats { get; protected set; } 

    public ModelTile() 
    { 
     LoadStats = ReactiveCommand.CreateAsyncTask(parameter => LoadStatsImp(this.IdText)); 

     LoadStats.ThrownExceptions 
     .SubscribeOn(RxApp.MainThreadScheduler) 
     .Subscribe(ex => UserError.Throw("Couldn't load stats", ex)); 

     _avaText= LoadStats.Select(stats => stats.Ava).ToProperty(this, x => x.AvaText, string.Empty); 

     _perText= LoadStats.Select(stats => stats.Per).ToProperty(this, x => x.PerText, string.Empty); 

     this.WhenAnyValue(x => x.IdText) 
     .Where(x => !String.IsNullOrWhiteSpace(x)) 
     .InvokeCommand(LoadStats); 
    } 

    public static async Task<StatsClass> LoadStatsImp(string id) 
    { 
     var stats = await DownloadRss(id); 

     System.Diagnostics.Debug.WriteLine($"number of stats: {stats}"); 

     return stats; 
    } 
} 
+0

來到謝謝您的回答,我發現我的問題是有點短,不明確。所以我編輯過,也許你有其他的解決方案或其他想法來解決這個問題。 –

+0

我稍微修改了它以適用於SearchResult類。讓我知道如果這不起作用,你得到什麼錯誤。 –

+0

它的工作原理!非常感謝你。我現在唯一得到的是一個Refit擴展錯誤。因爲我必須提出這麼多請求,所以我收到一條錯誤消息「400錯誤請求」。再次非常感謝你的幫助:) –