Wir haben leider nur zu laden, haben einen Itemscontrol Setup wie dieseMit WPF Items Virtualization Daten für sichtbare Elemente
<ScrollViewer>
<ItemsControl ItemsSource="{Binding Items}" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Data}"></TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
mit dem MainViewModel Wesen:
public class MainViewModel : ViewModelBase
{
public ObservableCollection<AutoUpdatingItem> Items
{
get;
set;
}
public MainViewModel()
{
Items = new ObservableCollection<AutoUpdatingItem>();
for (int i = 0; i < 1000; i++)
{
Items.Add(new AutoUpdatingItem(i));
}
}
}
und das Ansichtsmodell der Reihe
public class AutoUpdatingItem : ViewModelBase
{
private readonly DispatcherTimer timer;
private int data;
public int Data
{
get { return data; }
set { Set(ref data, value); }
}
public AutoUpdatingItem(int i)
{
Data = i;
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(20);
timer.Start();
timer.Tick += Timer_Tick;
}
private void Timer_Tick(object sender, EventArgs e)
{
// Data would be fetched from WebService here
Data++;
}
}
Wie können wir erreichen, dass nur die sichtbaren Elemente aktualisiert werden? Gibt es eine Möglichkeit, benachrichtigt zu werden, wenn ein Artikel im virtualisierten Panel recycelt wird?
Ich würde Eigenschaft 'IsVisibly' binden und auf der Grundlage dieses Start/Timer stoppen, wenn es notwendig ist . –