Windows Phone应用程序中的图像控件未刷新

时间:2013-07-17 05:20:15

标签: image windows-phone-7 windows-phone-8 windows-phone

我的应用程序中有一个图像列表,它们都在列表框中,我将源代码作为URL。

一切正常,能够显示我给出的网址图片。

当我更改图片并重新加载我的ListBox时,更改未反映在该图片上时,它会显示旧图片而不是新图片。

我确信,在图像更改后我将新图像URL绑定到源,但它显示旧图像,我无法找到为什么会发生这种情况,这里是我的代码

  <ListBox Grid.Row="1" HorizontalAlignment="Left" Margin="0,81,0,0" Name="wishListListBox" VerticalAlignment="Top" Width="480" Visibility="Visible">
        <ListBox.ItemTemplate>
            <DataTemplate>

                    <Image ImageFailed="wishlistImage_ImageFailed_1" x:Name="wishlistImage" HorizontalAlignment="Left" Width="164" Margin="12,54,0,88" Stretch="Fill">
                        <Image.Source>
                            <BitmapImage CreateOptions="DelayCreation,IgnoreImageCache" UriSource="{Binding thumb_image}" />
                        </Image.Source>
                    </Image>

            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>

这是我的课程,我从中为我的图片设置了itemsource

[DataContract]
public class WishListResponse : INotifyPropertyChanged
{

 [DataMember]
 public List<string> thumb_images { get; set; }

 public string thumb_image
    {
        get
        {
            if (thumb_images.Count != 0)
                return thumb_images[0];
            else
                return "";
        }
        set
        {
            thumb_images[0] = value;
            OnPropertyChanged(thumb_images[0]);
        }
    }
   public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
 }

在我的主页面中我像这样绑定项目来源

 public static List<WishListResponse> wishlistList = new List<WishListResponse>();

 wishListListBox.ItemsSource = wishlistList.ToArray();

任何人都可以帮我刷新我的图像控件。 谢谢。

4 个答案:

答案 0 :(得分:1)

好的,谢谢你的更新: - )

首先回答您原来的问题.. ;-)如果您将List替换为ObservableCollection,当您更改列表条目时,它会自动更新用户界面。

 public ObservableCollection<string> ThumbImages { get; set; }

现在,如果您设置了ThumbImages new,即为其分配新对象,则必须再次将DataContext设置为新引用,例如:

ThumbImages = new ObservableCollection<string>(wishListResponse.thumb_images);
DataContext = ThumbImages;

现在通常将datacontext设置为视图的模型,在您的情况下是一个字符串列表。您可以在后面的代码中设置如下的datacontext:

DataContext = ThumbImages;

然后您可以使用默认绑定引用datacontext:

 <ListBox ItemsSource="{Binding}">...</ListBox>

因此,您将不再需要在WishListResponse上创建特殊属性并将ItemTemplate再次设置为Element,即在此上下文中再次使用默认绑定:

 <ListBox ItemsSource="{Binding}" Grid.Row="1" HorizontalAlignment="Left" Margin="0,81,0,0" Name="wishListListBox" VerticalAlignment="Top" Width="480" Visibility="Visible">

        <ListBox.ItemTemplate>
            <DataTemplate>

                    <Image ImageFailed="wishlistImage_ImageFailed_1" x:Name="wishlistImage" HorizontalAlignment="Left" Width="164" Margin="12,54,0,88" Stretch="Fill">
                        <Image.Source>
                            <BitmapImage CreateOptions="DelayCreation,IgnoreImageCache" UriSource="{Binding}" />
                        </Image.Source>
                    </Image>

            </DataTemplate>
        </ListBox.ItemTemplate>

    </ListBox>

HTH

答案 1 :(得分:1)

我在这个问题上尝试了非常简单的解决方案,它对我有用,

我每次需要刷新图像时都更改了图像链接, 这意味着我只是将当前时间附加到图片网址。

这对我来说很好。

谢谢。

答案 2 :(得分:0)

我认为代码中的更改未通知xaml,因此您必须从INotifyChange继承该类,然后进行属性更改事件...如

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

然后在

之后的列表属性集中
 listname = value;
OnPropertyChanged("listname");

我希望这对你有帮助....

答案 3 :(得分:0)

我认为原因是你的模型没有实现INotifyPropertyChanged,所以你的属性已经改变了,但是无法通知图片绑定属性,要解决这个问题

一个是实现INotifyPropertyChanged;

另一个你可以这样做

wishListListBox.ItemsSource =null;
wishListListBox.ItemsSource = itemsSource;

它还会使您的列表框显示新项目

但是当itemsSource改变时它有问题你必须这样做........

希望这可以帮到你