【发布时间】:2013-01-11 11:09:59
【问题描述】:
在我的 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 方法进行排序。
提前致谢!
【问题讨论】:
标签: wpf mvvm prism reactiveui