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));
このコマンドは、orderby句を使用してコレクションを順序付ける関数も呼び出します。
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]'.
いくつか質問があります。
Tickets
1)モデルを直接設定できないのはなぜですか?OrderBy
最初に、の結果をある種の観察可能なコレクションに変換する必要がありますか?
2)これを行うためのより良い方法はありますか?
編集:明確化
私が今取っているアプローチは次のとおりです。
- コレクションは
Tickets
x秒ごとにリセットされます。 sortTickets
関数が呼び出されるとすぐに、このコレクションを次のように並べ替えてリセットします。Tickets = Tickets.OrderBy(c => c.Name).ToList(); //for example
コレクションが再度読み込まれるときに、プロパティ
Tickets
を設定する前に、コレクションを並べ替える必要があるかどうかを確認して並べ替えTickets
ます。
私は基本的にコレクションをロード時とソート時の2つのポイントに設定しているので、これは少しハッキーな感じがします。さらに、ロード時にReactiveUIヘルパー-> ToPropertyを使用しています:
LoadTickets.RegisterAsyncFunction(x => loadTickets())
.ToProperty(this, x => x.Tickets);
一方、並べ替えると、自分でそれを実行します。
Tickets = Tickets.OrderBy(model.Selector).ToList();
ロード時にすでに使用しているReactiveUIアプローチを使用してソートを行うためのより良い方法があるかどうか疑問に思っています。
前もって感謝します!