Используя ReactiveUI 6.5, я пытаюсь добиться чего-то вроде выражения SelectMany LINQ с функцией CreateDerivedCollection RxUI. Объекты в моей исходной коллекции (тип «A») имеют свойство IsSelected
, а также другое свойство коллекции, где элементы имеют тип «B». Я хочу получить IReactiveDerivedList<B>
, который представляет собой плоский список всех объектов B из выбранных A. Надеюсь, это имеет смысл.
Чтобы сделать это немного более конкретным, давайте используем пример приложения для просмотра файлов журнала. Скажем, у нас есть тип LogFileViewModel
, и модель представления нашего основного экрана имеет их список. Каждый экземпляр в списке представляет файл журнала в системе, и мы представляем их список, который может выбрать пользователь. Это список с множественным выбором, поэтому они могут выбрать более одного за раз.
Затем LogFileViewModel
имеет логическое свойство IsSelected
, которое будет установлено в значение true/false, когда пользователь выбирает или отменяет выбор соответствующего элемента в списке. И у него есть свойство List<LogEntry>
. Каждый объект LogEntry
, конечно же, представляет собой одну запись в соответствующем файле журнала.
Что я хочу сделать, так это иметь реактивный список в модели основного представления, который представляет собой список всех объектов LogEntry
для всех выбранных в данный момент объектов LogFileViewModel
. ReactiveList выбранных файлов журнала прост, но я застрял на второй части. Вот как в основном будет выглядеть модель основного представления:
public class MainViewModel
{
public MainViewModel()
{
//This gets initialized with the log files somehow, doesn't matter
LogFiles = new List<LogFileViewModel(...);
SelectedLogFiles = LogFiles.CreateDerivedCollection(l => l, l => l.IsSelected);
SelectedLogFileEntries = ? //How to create this one?
}
public List<LogFileViewModel> LogFiles { get; private set; }
public IReactiveDerivedList<LogFileViewModel> SelectedLogFiles { get; private set; }
public IReactiveDerivedList<LogEntry> SelectedLogFileEntries { get; private set; }
}
Есть ли известный способ сделать это, которого я просто не вижу? Если нет, какие умные идеи для достижения такого поведения? :-)
Изменить: похоже, я пропустил этот вопрос в моем первоначальном поиске. Пол предоставил «умное» решение этой проблемы около 2 лет назад. Итак, мой вопрос сейчас ... это все еще лучший способ добиться такого поведения?
.SelectMany
- person Aron   schedule 19.08.2015