【问题标题】:Xamarin.Forms ListView with ReactiveUI does not update new items带有 ReactiveUI 的 Xamarin.Forms ListView 不会更新新项目
【发布时间】:2019-08-09 04:35:35
【问题描述】:

我正在开发 Xamarin.Forms 应用程序。它在 NavigationBar 中有 SearchBar,在 ContentPage 中有 ListView,在底部有一个带有 AddButton 的条目。当用户单击AddButton 时,条目中的文本将添加到领域移动数据库中。其中自动刷新IEnumerablebind 到 IEnumerable auto updates 的 ListView。

 public class MainViewModel : ReactiveObject
{

    public IEnumerable<Company> Companies { get; set; }

    [Reactive]
    public string Query { get; set; }

    public string NewCompany { get; set; }

    public ReactiveCommand<Unit, Unit> AddCompanyCommand { get; set; }
    public ReactiveCommand<Unit, IEnumerable<Company>> SearchCommand { get; set; }

    Realm _realm;

    public MainViewModel()
    {

        _realm = Realm.GetInstance();

        Companies = _realm.All<Company>();

        AddCompanyCommand = ReactiveCommand.CreateFromTask(async () => await AddButtonClicked());
        SearchCommand = ReactiveCommand.Create<Unit, IEnumerable<Company>>(
            _ =>

            SortCollection()
            );


        SearchCommand.ToProperty(this, nameof(Companies));

        this.WhenAnyValue(x => x.Query).Throttle(TimeSpan.FromSeconds(1)).Select(_ => Unit.Default).InvokeCommand(this, x => x.SearchCommand);


    }

    async Task AddButtonClicked()
    {
        if (!string.IsNullOrWhiteSpace(NewCompany))
        {
            _realm.Write(() =>
            {
                _realm.Add(new Company { Name = NewCompany });
            });
            NewCompany = string.Empty;
        }
    }

    IEnumerable<Company> SortCollection()
    {
        if (string.IsNullOrWhiteSpace(Query))
        {
            Companies = Companies.Where(x => x.Name != string.Empty);
        }
        else
        {
            Companies = Companies.Where(x => x.Name.IndexOf(Query, StringComparison.InvariantCultureIgnoreCase) >= 0);
        }

        return Companies;


    }

}

最近,当我将搜索逻辑添加到 ViewModel 时,ListView 不会自动更新。我要么必须 search 要么重新启动应用程序以在 ListView 中显示 new item。当我注释掉以下行时,ListView 开始自动更新。

 SearchCommand.ToProperty(this, nameof(Companies));

但随后它停止显示搜索结果。我希望使用新项目自动更新并在 ListView 中显示搜索结果功能。

【问题讨论】:

    标签: xamarin.forms realm reactiveui


    【解决方案1】:

    乍一看,您的public IEnumerable&lt;Company&gt; Companies { get; set; } 没有通知属性更改事件。

    【讨论】:

    • 但是如果我注释掉它就会开始通知:“ SearchCommand.ToProperty(this, nameof(Companies));”。
    • 干扰使用新项目更新 ListView 的同一行正在使用 SearchResults 正确更新 ListView。
    • 你没有对你的 ToProperty 做任何事情。
    【解决方案2】:

    您需要告诉运行时属性已更改,因此您需要实现通知属性更改接口 看看这个另一个 stackoverflow 线程。

    Implementing INotifyPropertyChanged - does a better way exist?

    还有一个名为 fody 的插件,它会自动将 propertychanged 代码注入项目中的每个属性设置器。不需要你做任何事情。

    将它们都安装在您正在编写属性的项目中,它会在编译时自动注入属性更改的代码。 https://www.nuget.org/packages/Fody/ https://www.nuget.org/packages/PropertyChanged.Fody/

    【讨论】:

    • 我正在使用领域,它会自动更新集合并通知视图。我已经在使用 ReactiveUI.Fody。但我的公司收藏中不需要它。
    • ObserableAsPropertyHelper 执行 inotifyprooertychanged 通知。
    猜你喜欢
    • 2020-12-12
    • 2017-08-06
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多