如何更新现有值的ReactiveList

本文关键字:ReactiveList 何更新 更新 | 更新日期: 2023-09-27 18:13:47

在过去的几个小时里,我试图解决如何更新ObservableCollection中的现有值的问题。我将在下面用一些例子来解释我要做什么。

正在Xamarin中加载的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做些什么?

感谢您的阅读。

亲切的问候,费尔南多

如何更新现有值的ReactiveList

我刚刚注意到你的搜索反应命令。这一点可能也需要改变。查看下面的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。

大部分来自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;
   }
}