gpt4 book ai didi

wpf - 使用Reactiveui订购可观察的集合

转载 作者:行者123 更新时间:2023-12-03 10:55:32 24 4
gpt4 key购买 nike

我在订购ViewModel中的可观察集合时遇到一些困难。
这是我的情况:

在我的 View 模型中,我有以下列表:

public List<TicketModel> Tickets
{
get { return _Tickets.Value; }
set
{
{
this.RaiseAndSetIfChanged(c => c.Tickets, value);
}
}
}
private ObservableAsPropertyHelper<List<TicketModel>> _Tickets;

此列表使用 ReactiveAsyncCommand填充:
LoadTickets.RegisterAsyncFunction(x => loadTickets())
.ToProperty(this, x => x.Tickets);

到目前为止所有作品。

我有另一个命令 SortByCommand,只要用户想对集合进行排序就可以调用它。该命令如下所示:
SortByCommand = new ReactiveCommand(this.WhenAny(c => c.Tickets, ((tickets) => tickets.Value != null && tickets.Value.Count > 0)));
SortByCommand.Subscribe(c => sortTickets((SortByModel)c));

该命令还调用使用order by子句对集合进行排序的函数:
private void sortTickets(SortByModel model)
{
Tickets = Tickets.OrderBy(model.Selector).ToList();
}

每当调用 sortTickets函数时,都会引发一个异常,该异常表示:
Unable to cast object of type 'ReactiveUI.ObservableAsPropertyHelper`1[System.Collections.Generic.List`1[Bugmine.Modules.MyPage.Models.TicketModel]]' to type 'System.Collections.Generic.List`1[Bugmine.Modules.MyPage.Models.TicketModel]'.

我有几个问题:

1)为什么我不能直接设置 Tickets模型?我是否需要首先将 OrderBy的结果转换为某种可观察的集合?

2)有更好的方法吗?

编辑:澄清

我现在采用的方法是:
  • 每隔x秒重置Tickets集合一次。
  • 一旦调用sortTickets函数,我将通过以下方式对该集合进行排序和重置:
    Tickets = Tickets.OrderBy(c => c.Name).ToList(); //for example
  • 当再次加载Tickets集合时,我将检查是否应该对其进行排序,并在设置Tickets属性之前对其进行排序。

  • 这有点琐,因为我基本上将集合设置为两点-加载时和排序时。此外,加载后,我正在使用ReactiveUI帮助器-> ToProperty:
    LoadTickets.RegisterAsyncFunction(x => loadTickets())
    .ToProperty(this, x => x.Tickets);

    而排序后,我自己这样做:
    Tickets = Tickets.OrderBy(model.Selector).ToList();

    我想知道是否有更好的方法使用加载时已经使用的ReactiveUI方法进行排序。

    提前致谢!

    最佳答案

    解决此问题的另一种方法是通过CreateDerivedCollection:

    SortedTickets = Tickets.CreateDerivedCollection(
    x => new TicketViewModel(x),
    orderer: (l,r) => SortModel.Selector(l, r), // Returns CompareTo() result
    signalReset: this.WhenAny(x => x.SortModel, x => x.Value)); // Reorder on SortModel change

    请注意,如果 Tickets反复设置为 (在本例中为),则此操作会失败-您可以将模型更改为在ctor中初始化 Tickets,然后清除并添加所有项目,即
    LoadTickets.RegisterAsyncFunction(x => loadTickets())
    .Subscribe(x => {
    // TODO: Make sure Tickets is a ReactiveCollection
    Tickets.Clear();
    Tickets.AddRange(x); // Will trigger resorting of SortedTickets
    });

    关于wpf - 使用Reactiveui订购可观察的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14556508/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com