我在我的 ViewModel 中订购一个可观察的集合时遇到了一些困难。这是我的情况:
在我的视图模型中,我有以下列表:
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)有没有更好的方法来做到这一点?
编辑:澄清
我现在采取的方法是:
- 该
Tickets
集合每 x 秒重置一次。 调用该
sortTickets
函数后,我将按以下方式排序和重置此集合:Tickets = Tickets.OrderBy(c => c.Name).ToList(); //for example
再次
Tickets
加载集合时,我会检查它是否应该排序,并在设置Tickets
属性之前对其进行排序。
这感觉有点 hacky,因为我基本上将集合设置在两个点 - 在加载和排序时。此外,在加载时,我正在使用 ReactiveUI 助手 -> ToProperty:
LoadTickets.RegisterAsyncFunction(x => loadTickets())
.ToProperty(this, x => x.Tickets);
然而,在排序时,我自己正在这样做:
Tickets = Tickets.OrderBy(model.Selector).ToList();
我想知道是否有更好的方法来使用我在加载时已经使用的 ReactiveUI 方法进行排序。
提前致谢!