使用“;等待”;在转换器(IValueConverter)中不工作

本文关键字:IValueConverter 工作 转换器 等待 使用 | 更新日期: 2023-09-27 18:26:41

我的Windows Phone应用程序中有一个转换器,但你似乎不能在其中使用"await"方法?

public object Convert(object value, Type targetType, object parameter, string language)
{
    _IDataService = ServiceLocator.Current.GetInstance<IDataService>();
    string imageUrlId = (string)value;
    byte[] imageByte = await iDataService.GetImage(imageUrlId);
    return LoadImageAsync(imageByte);
}

如果我将方法设为async Task,它表示IValueConverter没有方法Task async。此转换器返回类型ImageSource。

使用“;等待”;在转换器(IValueConverter)中不工作

您不能更改Convert方法的签名,因为您必须为IValueConverter接口的所有方法提供一个实现。

我通常所做的是从后端异步加载视图模型的图像,而不是在UI线程上。有了正确的绑定,图像一加载就会显示在UI上。

我在这里有一个较老的答案,主要解决了这个问题(但请参阅下文-其中一种助手类型有些过时)。

问题的核心是异步工作实际上对于值转换器来说是不合适的。你真正要做的是告诉WPF"要将这种类型转换为另一种类型,首先调用web服务…"

因此,IMO任何异步行为都可以在系统的其他部分(ViewModel、服务层等)中更好地完成。通过使用我的NotifyTask类型,异步工作可以很容易地在ViewModel中表示。

然而,我以前的答案确实有一个有效的"异步值转换器"。请注意,该答案中的TaskCompletionNotifier类型具有较新的实现。

您可以在异步函数调用后使用.result()

类似于,byte[]imageByte=iDataService.GetImage(imageUrlId).result();