2009-08-11 12 views
0

je dois remplir une zone de liste avec des articles un par un comme la liste à remplir avec un élément qu'après 1/5 s un autre élément sera ajouté à la listeWPF ListBox databinding

des idées comment cette pourrait être fait (en wpf)?

Répondre

2

Si vous liez la zone de liste à un ObservableCollection<T>, vous ne pouvez modifier la collection du thread d'interface utilisateur. Donc, vous pouvez utiliser un DispatcherTimer, ce qui déclenche l'événement Tick sur le thread d'interface utilisateur, ou utiliser une collection spécialisée comme this one et le remplir d'un autre thread

0

Dans le cas équipé de la fenêtre ou de contrôle, exécuter la méthode pour charger le premier élément de données en appelant la méthode BeginInvoke du System.Windows.Threading.DispatcherObject pour l'élément d'interface utilisateur , et spécifier un système. Windows.Threading.DispatcherPriority de l'arrière-plan. Lorsque cette méthode a fini de générer les données et de les ajouter à la liste, ajoutez la même méthode à la file d'attente du Dispatcher récursivement, en ajoutant chaque fois un seul élément et en mettant en file d'attente l'appel pour ajouter le suivant avec une DispatcherPriority of Background.

private ObservableCollection<string> numberDescriptions; 
// Declare a delegate to wrap the LoadNumber method 
private delegate void LoadNumberDelegate(int number); 
private void LoadNumber(int number) 
{ 
// Add the number to the observable collection 
// bound to the ListBox 
numberDescriptions.Add("Number " + number.ToString()); 
if(number < 10000) 
{ 
// Load the next number, by executing this method 
// recursively on the dispatcher queue, with 
// a priority of Background. 
// 
this.Dispatcher.BeginInvoke(
DispatcherPriority.Background, 
new LoadNumberDelegate(LoadNumber), ++number); 
} 
} 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
// Initialize an ObservableCollection of strings 
numberDescriptions = 
new ObservableCollection<string>(); 
// Set it as the ItemsSource for the ListBox 
listBox.ItemsSource = numberDescriptions; 
// Execute a delegate to load 
// the first number on the UI thread, with 
// a priority of Background. 
// 
this.Dispatcher.BeginInvoke(
DispatcherPriority.Background, 
new LoadNumberDelegate(LoadNumber), 1); 
} 

voir WPF Recipes in C# 2008 Charger les objets dans une zone de liste de manière asynchrone (pg 460)

0

Voici un exemple de la façon de lier une zone de liste avec flux RSS avec DataTemplate:

<UserControl.Resources> 
     <XmlDataProvider x:Key ="DataRSS" XPath="//item" Source="http://rss.feedsportal.com/c/629/f/502199/index.rss"></XmlDataProvider > 
    </UserControl.Resources > 

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> 

      <ListBox ItemsSource="{Binding Source={StaticResource DataRSS}}" Height="516" Margin="0,0,32,0" Background="{x:Null}" BorderBrush="#FF627DAE"> 
       <ListBox.ItemTemplate > 
        <DataTemplate > 
         <Grid Width="400" Height="100" >         

          <Image Source="{Binding XPath=enclosure/@url}" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Top" /> 
          <TextBlock TextWrapping="Wrap" Text="{Binding XPath=title}" FontWeight="Bold" Grid.Column="2"/> 
         </Grid> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </StackPanel> 
</grid>