Есть ли способ использовать асинхронный c преобразователь значения в реактивном интерфейсе? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть модель представления со свойством изображения типа 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 Ответ

0 голосов
/ 26 марта 2020

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

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