ReactiveUI SelectMany форма CreateDerivedCollection

Используя 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 лет назад. Итак, мой вопрос сейчас ... это все еще лучший способ добиться такого поведения?


person Kevin Kuebler    schedule 19.08.2015    source источник
comment
Вместо этого вы можете попробовать BLinq или CLinq, так как они реализуют .SelectMany   -  person Aron    schedule 19.08.2015
comment
или даже, может быть, OLinq.   -  person Aron    schedule 19.08.2015
comment
@Арон. Спасибо, эти проекты выглядят интересно. Таких раньше не видел. На данный момент, однако, я хотел бы остаться в сфере Rx и Rx-UI, тем более, что, похоже, есть способ сделать это (см. ссылку, которую я разместил в своем редактировании). Мне просто интересно, есть ли более простой/чистый способ сделать это в последней версии Rx-UI.   -  person Kevin Kuebler    schedule 19.08.2015