有没有办法在反应式 ui 中使用异步值转换器?
Is there an way to use an async value converter in reactive ui?
我有一个视图模型,其图像 属性 类型为 byte[]。
我有一个图像项目 Windows.UI.Xaml.Controls.Image 类型的视图
在我的视图后面的代码中,我想将视图模型图像 属性 绑定到视图图像。
我的代码如下:
this.WhenActivated(disposables =>
{
this.OneWayBind(ViewModel, vm => vm.Image2, v => v.Image.Source, async (bytes) => await ConvertAsync(bytes))
.DisposeWith(disposables);
});
这会导致错误:无法将 lambda 表达式转换为类型 'object',因为它不是委托类型 。转换器如下:
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 并使方法同步不是一个选项,因为它会挂起 ui 线程。
如果使用转换器无法实现,您推荐的解决方案是什么?当然,我可以更改视图模型中的类型,但这取决于 UWP 平台。我宁愿没有。
这是因为那里不支持异步。你可以做类似
this.WhenAnyValue(x => x.ViewModel.Image2).SelectMany(x => ConvertAsync(x)).BindTo(this, x => x.Image.Source)
我有一个视图模型,其图像 属性 类型为 byte[]。 我有一个图像项目 Windows.UI.Xaml.Controls.Image 类型的视图 在我的视图后面的代码中,我想将视图模型图像 属性 绑定到视图图像。
我的代码如下:
this.WhenActivated(disposables =>
{
this.OneWayBind(ViewModel, vm => vm.Image2, v => v.Image.Source, async (bytes) => await ConvertAsync(bytes))
.DisposeWith(disposables);
});
这会导致错误:无法将 lambda 表达式转换为类型 'object',因为它不是委托类型 。转换器如下:
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 并使方法同步不是一个选项,因为它会挂起 ui 线程。 如果使用转换器无法实现,您推荐的解决方案是什么?当然,我可以更改视图模型中的类型,但这取决于 UWP 平台。我宁愿没有。
这是因为那里不支持异步。你可以做类似
this.WhenAnyValue(x => x.ViewModel.Image2).SelectMany(x => ConvertAsync(x)).BindTo(this, x => x.Image.Source)