wpf listbox привязка данных - PullRequest
       5

wpf listbox привязка данных

0 голосов
/ 11 августа 2009

мне нужно заполнить список пунктами один за другим например, если список будет заполнен одним элементом, то через 1/5 секунды другой элемент будет добавлен в список

есть идеи, как это можно сделать (в wpf)?

Ответы [ 3 ]

2 голосов
/ 11 августа 2009

Если вы связываете ListBox с ObservableCollection<T>, вы можете изменять только коллекцию из потока пользовательского интерфейса. Таким образом, вы можете использовать DispatcherTimer, который вызывает событие Tick в потоке пользовательского интерфейса, или использовать специализированную коллекцию, например this * , и заполнить ее из другого потока

.
0 голосов
/ 04 июня 2015

Вот пример того, как связать список со RSS-фидом с 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>
0 голосов
/ 11 августа 2009

В событии Loaded окна или элемента управления выполните метод для загрузки первого элемента данных. вызывая метод BeginInvoke для System.Windows.Threading.DispatcherObject для Элемент пользовательского интерфейса и укажите System.Windows.Threading.DispatcherPriority для фона. когда этот метод завершил генерацию данных и добавление их в список, добавьте тот же метод в рекурсивная очередь диспетчера, каждый раз добавляя только один элемент, а затем ставя в очередь вызов добавить следующий с DispatcherPriority фона.

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);
}

см. Рецепты WPF в C # 2008 Асинхронно загружать элементы в ListBox (стр. 460)

...