我有一个应用程序,它显示来自可观察集合的数据。可观察集合(在此调试设置中)创建并仅仅一次,然后值保持不变。
应用程序的主视图包含一个绑定到所述可观察集合的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实现了子元素绑定到的DependancyProperty:
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;
}
}
}
此setter配置其他设置器,然后在用户控件中设置元素。用户控件中没有任何内容绑定,只需直接访问相应的内容/文本属性即可完成少量更新。 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));
}
当我在列表框中向下滚动并备份时,当拥有元素返回视图时,将执行 Post 的 setter 。问题:value是ItemViewModel的不同实例。 ListBox ItemsSource不以任何方式从类外部访问。向上滚动时,似乎错误的项目绑定到元素,导致设计失真。引起这种情况的Binding是否有任何问题?
答案 0 :(得分:1)
问题是由ListBox引起的。滚出视图的元素将被回收并附加在另一侧。在上面的代码中,异步操作没有检查结果是否仍然有效,导致显示数据错误。