В настоящее время я использую собственный объект изображения (обертка вокруг объекта <Image>
) в спискеView. Свойства моего пользовательского объекта изображения не изменяются, когда новый элемент списка виден (реализован).Виртуализация не меняя свойств новых видимых элементов.
Например, если мой список (содержащий 30 элементов с разными URL-адресами изображений и другим текстом) имеет 3 элемента в первом прокрутке, то 10-й элемент имеет то же изображение, что и 1-й элемент. Образы повторяются в порядке [1-9] [1-9] [1-9]. Но, к моему удивлению, текст во всех 30 списках элементов отличается.
При отладке я обнаружил, что сеттер для моего объекта изображения вызывается только для первых 9 элементов. Может ли кто-нибудь пролить свет на то, как другие системные компоненты (System Image/TextBlock работают нормально) получают новые значения элементов?
Фрагмент кода соответствующего свойства класса:
public sealed partial class CustomImage : UserControl
{
public static readonly DependencyProperty ImageSourceStringProperty = DependencyProperty.Register("ImageSourceString", typeof(string), typeof(CustomImage), new PropertyMetadata(null, new PropertyChangedCallback(ImageSourceStringChanged)));
public string ImageSourceString
{
get { return (string)GetValue(ImageSourceStringProperty); }
set
{
//THIS NEVER GETS HIT FOR ITEMS AFTER 9th ITEM
SetValue(ImageSourceStringProperty, value);
//{More code here}
}
}
}
Xaml Usage
<ListView ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<custom:customImage x:Name="Img" ImageSourceString="{Binding ImgPath}"/>
<TextBlock Grid.Column="1" Text="{Binding Name}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Я пропускаю, как она должна работать? Если что-то неясно, сообщите мне, я могу уточнить.
Ссылка на образец проекта: https://onedrive.live.com/redir?resid=1E821DC34DAB55E6!93133&authkey=!ADgUGdiBejywGCE&ithint=file% 2czip В окне вывода вы можете увидеть, что геттер не попадает в последующую часть списка –