WPF中对于异步返回的绑定
举个例子,实现一个用户头像的Image控件,绑定的是url。而我的需求是下载url的图片,做本地缓存,再显示。
Converter实现需要继承自IValueConverter,而它的两个接口都是同步,而下载函数是异步async的。此时在Convert函数实现内使用await关键词是不允许的。
解决方案思路:
返回一个新的类对象,该类包装Task,继承自INotifyPropertyChanged,带一属性Result。当Task完成的时候,给Result赋值,同时触发INotifyPropertyChanged中的事件。
XAML中绑定对象的控件需要将原来的Content绑定设置到DataContext上,Content另绑定Converter返回的对象的Result属性。
上一点代码:
public sealed class TaskCompletionNotifier<TResult> : INotifyPropertyChanged { public TaskCompletionNotifier(Task<TResult> task) { Task = task; if (!task.IsCompleted) { var scheduler = (SynchronizationContext.Current == null) ? TaskScheduler.Current : TaskScheduler.FromCurrentSynchronizationContext(); task.ContinueWith(t => { var propertyChanged = PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs("IsCompleted")); if (t.IsCompleted) { propertyChanged(this, new PropertyChangedEventArgs("Result")); }else{//do something else; } } }, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, scheduler); } } public Task<TResult> Task { get; private set; } public TResult Result { get { return (Task.Status == TaskStatus.RanToCompletion) ? Task.Result : default(TResult); } } public event PropertyChangedEventHandler PropertyChanged; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架