我在订购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)有更好的方法吗?
编辑:澄清
我现在采用的方法是:
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/