WP7.8:滚动框中的绑定项更新为错误数据

本文关键字:绑定 更新 错误数据 滚动 WP7 | 更新日期: 2023-09-27 18:29:09

概述

我有一个应用程序,它显示来自可观察集合的数据。可观察集合(在此调试设置中)只创建并实例化一次,然后值保持不变。

应用程序的主视图包含一个ListBox,该ListBox绑定到所述可观察集合:

<ListBox x:Name="MainListBox" ItemsSource="{Binding Items}" SelectionChanged="MainListBox_SelectionChanged" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel MinWidth="456" MaxWidth="456" Background="White" Margin="0,0,0,17">
                <sparklrControls:SparklrText Post="{Binding Path=.}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <!-- Workaround used to stretch the child elements to the full width -> HorizontalContentAlignment won't work for some reason... -->
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

子项绑定到UserControl。此UserControl实现了子元素绑定到的DependencyProperty:

public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(object), new PropertyMetadata(textPropertyChanged));
private static void postPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    SparklrText control = d as SparklrText;
    control.Post = (ItemViewModel)e.NewValue;
}

绑定到post属性通过post属性的getter配置其他变量

    public ItemViewModel Post
    {
        get
        {
            return post;
        }
        set
        {
            if (post != value)
            {
                this.ImageLocation = value.ImageUrl;
                this.Username = value.From;
                this.Comments = value.CommentCount;
                this.Likes = value.LikesCount;
                this.Text = value.Message;
                post = value;
            }
        }
    }

此设置器配置其他设置器,这些设置器又在用户控件中设置元素。用户控件中没有任何内容被绑定,少数更新是通过直接访问相应的Content/Text属性来完成的。ImageLocation使用执行图像的异步下载

    private void loadImage(string value)
    {
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += (sender, e) =>
        {
            image = new BitmapImage();
            image.SetSource(e.Result);
            MessageImage.Source = image;
        };
        wc.OpenReadAsync(new Uri(value));
    }

问题

当我在列表框中向下滚动并向上滚动时,当所属元素返回视图时,Postsetter将被执行。问题:value是ItemViewModel的另一个实例。ListBox ItemsSource不是以任何方式从类外部访问的。当向上滚动时,元素似乎绑定了错误的项目,导致设计失真。绑定是否存在导致此问题的任何问题?

WP7.8:滚动框中的绑定项更新为错误数据

问题是由ListBox引起的。滚动出视图的元素将被回收并附加到另一侧。在上面的代码中,异步操作没有检查结果是否仍然有效,从而导致错误的显示数据。