0

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

一切正常,能够显示来自我提供的 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

4 回答 4

1

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

首先是您的原始问题.. ;-) 如果您将您的替换List为 an ObservableCollection,它将在您更改列表条目时自动更新 UI。

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

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

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

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

DataContext = ThumbImages;

然后您可以使用默认绑定引用数据上下文:

 <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>

高温高压

于 2013-07-17T05:37:14.430 回答
1

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

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

这对我来说很好。

谢谢你。

于 2013-09-18T03:55:03.977 回答
0

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

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

然后在列表的属性集合之后

 listname = value;
OnPropertyChanged("listname");

我希望这可以帮助你....

于 2013-07-17T06:21:52.777 回答
0

我认为原因是您的模型没有实现 INotifyPropertyChanged ,因此您的属性已更改,但无法通知图像绑定属性,以解决此问题

一种是实现 INotifyPropertyChanged ;

另一个你可以这样做

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

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

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

希望这可以帮助你

于 2013-07-17T07:35:46.083 回答