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

C# 使用;等待“;在转换器中(IValueConverter)不工作?,c#,async-await,converter,imagesource,C#,Async Await,Converter,Imagesource,我的Windows Phone应用程序中有一个转换器,但您似乎无法在其中使用“等待”方法 public object Convert(object value, Type targetType, object parameter, string language) { _IDataService = ServiceLocator.Current.GetInstance<IDataService>(); string imageUrlId = (string)valu

我的Windows Phone应用程序中有一个转换器,但您似乎无法在其中使用“等待”方法

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);
}
公共对象转换(对象值、类型targetType、对象参数、字符串语言) { _IDataService=ServiceLocator.Current.GetInstance(); 字符串imageUrlId=(字符串)值; byte[]imageByte=await iDataService.GetImage(imageUrlId); 返回LoadImageAsync(imageByte); }
如果我将方法设为异步任务,则表示IValueConverter没有异步的方法任务。此转换器返回ImageSource类型。

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

我通常做的是从后端异步加载视图模型的图像,而不是在UI线程上。使用正确的绑定,图像将在加载后立即显示在您的UI上。

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

比如,byte[]imageByte=iDataService.GetImage(imageUrlId.result()

我有一个更老的答案,主要解决这个问题(但请参见下文-其中一个助手类型有点过时)

问题的核心是异步工作实际上不适合值转换器执行。您真正要做的是告诉WPF“要将此类型转换为其他类型,请首先调用web服务…”

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


然而,我以前的答案中确实有一个“异步值转换器”。请注意,答案中的
TaskCompletionNotifier
类型已更改。

我明白了,我可以在我的一个模型类中使用Wait async吗?在“从属性获取”对话框中?不,不能对属性使用async关键字。(请参阅)只需使IDataService接口的GetImage方法异步即可。通过调用异步GetImage从视图模型加载图像,并将BitmapImage分配给视图模型的一个属性。:)是的,我明白了!但是我需要转到详细信息页面,然后再返回查看图像,当我登录时,我看到我的ListView中有空图像,转到详细信息页面,然后返回显示。我很高兴你得到了:)现在我需要知道如何在后台任务完成后更新xaml UI。@Bayen:
NotifyTask
类型就是用于此目的的。我有一个关于用法的例子。啊哈,看起来很有趣!这会解决这个问题吗@拜仁:从我对这个问题的回答来看,看起来是的
NotifyTask
专门用于使用后台操作的结果更新MVVM UI。好的,那么我将尝试此操作。我还发现,当我向下滚动并备份时,图像也会显示出来。你可以,但通常你永远不应该。