c# - vscrollbar - WP7.8: Elementos enlazados en scrollbox actualizados con datos incorrectos
vscrollbar visual basic español (1)
Visión de conjunto
Tengo una aplicación que muestra datos de una colección observable. La colección observable es (en esta configuración de depuración) creada y instanciada solo una vez , y los valores permanecen iguales.
La vista principal de la aplicación contiene un ListBox que está vinculado a dicha colección observable:
<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>
Los elementos secundarios están vinculados a un UserControl. Este UserControl implementa una DependancyProperty a la que los elementos secundarios están destinados:
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;
}
El enlace a la propiedad de publicación configura otras variables a través del captador de la propiedad Publicar
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;
}
}
}
Este setter configura otros que a su vez configuran elementos en el control del usuario. No hay nada en el control del usuario vinculado, las pocas actualizaciones se realizan con acceso directo a las respectivas propiedades de contenido / texto. ImageLocation realiza una descarga asíncrona de una imagen con
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));
}
Problema
Cuando me desplazo hacia abajo en el cuadro de lista y hacia atrás, el colocador de publicación se ejecuta cuando el elemento propietario vuelve a la vista. El problema: el valor es una instancia diferente de ItemViewModel. ListBox ItemsSource no se accede de ninguna manera desde fuera de la clase. Al desplazarse hacia atrás, parece que los Elementos incorrectos están vinculados a los elementos, lo que da como resultado diseños distorsionados. ¿Hay algún problema con el enlace que causa esto?
El problema fue causado por el ListBox. Los elementos que se desplazan fuera de la vista se reciclan y anexan al otro lado. En el código anterior, una operación asincrónica no verificaba si el resultado seguía siendo válido, lo que causaba datos de visualización incorrectos.