来自隔离存储的图像绑定?

时间:2011-11-14 17:17:16

标签: silverlight windows-phone-7 binding

我需要一些帮助来弄清楚为什么在XAML中绑定图像的两种不同方式的行为方式不同。

这是我的代码:

public class Picture 
    {

        public int ID
        {
            get;
            set;
        }

public string ThumbURL
        {
            get
            {
                return String.Format("http://"+ App.ServerAdress +"/Pictures/thumbs/{0}.jpg", ID);
            }

        }

        public int ThumbLocal
        {
           get { return ID; }
        }
}

public class ByteImageConverter : IValueConverter
    {

           public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {


            using (var store =
               IsolatedStorageFile.GetUserStoreForApplication())
            {


                if (!store.FileExists(value)) return null;

                var stream =
                    store.OpenFile(path, FileMode.Open);

                try
                {
                    var image = new BitmapImage();
                    image.SetSource(stream);
                    return image;
                }
                finally
                {
                    stream.Dispose();
                }
            }

        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }

如果我以这种方式绑定图像,它正在工作:

<Image  Width="110" CacheMode="BitmapCache" Source="{Binding ThumbURL}" 
                                    Margin="12,0,9,0"/>

但这种方式不会:

<Image  Width="110" CacheMode="BitmapCache" Source="{Binding ThumbLocal,  Mode=TwoWay, Converter={StaticResource imgConverter}}"  
                                        Margin="12,0,9,0"/>

当我尝试将照片从一个全景项目设置为另一个时,就会发生这种情况。我的情况我想将一个列表中的图片添加到另一个列表中,当我使用第一种类型的绑定时,一切正常。当我导航到其他页面并导航回来时,它正在工作,图片显示出来。我对这种行为感到有点困惑。

我有什么想法可以解决这个问题吗?

最后我意识到为什么会这样。绑定之前我必须从网上下载图片并将其保存到隔离存储,所有这些过程都是异步的。当我把图片绑定在那里时还没有图片。我试图从隔离存储中绑定现有图片并正确显示。所以,现在我需要像INotifyPropertyChanged这样的东西。如果我使用IValueConverter

,我是否可以这样做?

1 个答案:

答案 0 :(得分:0)

您可以这样做,如果图像不在隔离存储中 - 您开始下载图像,但只在下载完成时立即返回一个新的BitmapImage - 将图像保存为isosore并将其设置为BitmapImage的源。

类似的东西:

if (!store.FileExists(value))
{
    var image = new BitmapImage();
    ImageDownloadAndCachingHelper.DownloadImage(path, (s, e) => image.SetSource(e.ImageStream));
    return image;
}

由您来实现将本地路径转换为Web URI,下载并调用EventHandler的代码,其中ImageDownloadedEventArgs具有ImageStream。