Есть ли способ использовать асинхронный преобразователь значений в реактивном интерфейсе?

У меня есть viewmodel со свойством изображения типа byte []. У меня есть представление с элементом изображения типа Windows.UI.Xaml.Controls.Image В коде моего представления я хочу привязать свойство изображения viewmodel к изображению представления.

Код, который у меня есть, следующий:

this.WhenActivated(disposables =>
        {
            this.OneWayBind(ViewModel, vm => vm.Image2, v => v.Image.Source, async (bytes) => await ConvertAsync(bytes))
                .DisposeWith(disposables);
        });

Это приводит к ошибке: Невозможно преобразовать лямбда-выражение в тип «объект», потому что это не тип делегата . Конвертер следующий:

 static async Task<BitmapImage> ConvertAsync(byte[] bytes)
    {            
        using (var stream = new MemoryStream(bytes))            
        using (var randomAccessStream = stream.AsRandomAccessStream())                
        {
            var bitmapImage = new BitmapImage
            {
                DecodePixelHeight = 100,
                DecodePixelWidth = 100
            };
            await bitmapImage.SetSourceAsync(randomAccessStream);
            return bitmapImage;
        }
    }

Обратите внимание, что использовать bitmapImage.SetSource и сделать метод синхронным не вариант, потому что он вешает поток пользовательского интерфейса. Если это не может быть достигнуто с помощью конвертера, каково ваше рекомендуемое решение? Конечно, я могу изменить тип в viewmodel, но это зависит от платформы UWP. Которого я бы предпочел не иметь.

Всего 1 ответ


Это связано с тем, что Async там не поддерживается. Вы могли бы сделать что-то вроде

this.WhenAnyValue(x => x.ViewModel.Image2).SelectMany(x => ConvertAsync(x)).BindTo(this, x => x.Image.Source)

Есть идеи?

10000