在所有任务完成之前绑定不更新

时间:2017-04-26 19:18:09

标签: c# wpf data-binding async-await

我有一个ListView,其中包含一个包含我的用户控件的数据模板。此用户控件具有依赖项属性“MyObject”以及绑定到类型为MyObject的属性为“AsyncLazy<BitmapImage>”的Image组件。图像在后台异步下载并返回(同时还调用事件)。调用的事件在我的Image组件上启动动画以淡入并显示下载的图像。

问题

首先按预期执行此操作,但是如果图像在显着不同的时间下载,则动画仍然开始 - 但是在所有图像完成下载之后图像才会显示 - 导致某些图像只是弹出in - 因为在加载动画之前已经为它们启动了淡入淡出。

更进一步......

我更进了一步,为每个用户控件添加了一个方法,它在后台加载一些网站的数据 - 它运行得相当长,所以我只是在用户控件初始化时启动任务,就是这样。任务应该在后台运行,并在完成等待它时将结果存储到属性“MyObject”。

但出于某种原因 - 在上述任务完成之前,图像不会开始下载。

代码

我的用户控件的XAML

<Image x:Name="mainImage" Source="{Binding ImageMedium.Value.Result, IsAsync=True, UpdateSourceTrigger=PropertyChanged}"/>

“MyObject”

中的属性
public AsyncLazy<BitmapImage> ImageMedium { get; }
public List<MyEntry> Entries { get; private set; }

用户控制初始化

 public void Init()
 {
      MyObject.GetEntries(); 
      // this long-running task should just run in the BG without waiting for it
      // ...
 }

“GetEntries”方法

public async Task GetEntries()
{
      var t = await Task.Run(() => Do some work... );                       
      Entries = t; // store result to a MyObject property
}

获取图像

ImageMedium = new AsyncLazy<BitmapImage>(() =>
{
      var data = GetImage(ImageSize.Medium); // normal long-running method
      ImageLoaded?.Invoke(data, ImageSize.Medium); // event that starts animation
      return data;
});

动画

control.MyObject.ImageLoaded += (img, s) =>
{
    // start animation when Image is loaded
    control.UIContext.Send(async (a) => {
           await Task.Delay(500);
           DoubleAnimation dan1 = new DoubleAnimation(1.0, TimeSpan.FromSeconds(0.7));
           control.mainImage.BeginAnimation(OpacityProperty, dan1);
     }, null);
};

我还尝试实施INotifyPropertyChanged并将调整与调用事件一起通知 - 但没有解决任何问题。

编辑:经过进一步测试,似乎图像DO在长时间运行的任务完成之前开始下载 - 但下载在实际开始之前延迟了大约20-30秒。

0 个答案:

没有答案