WPF listBox dataContextChanged - PullRequest
       17

WPF listBox dataContextChanged

2 голосов
/ 04 ноября 2010

У меня есть список в userControl, и я хочу выбрать первый элемент в списке каждый раз, когда изменяется datacontext моего userControl. (ListSource ItemsSource является привязанным к userControl dataContext:

<userControl>
     <ListBox Name="listBox_Resources" ItemsSource="{Binding Path=Resources}" DataContextChanged="listBox_Resources_DataContextChanged">                
      </ListBox>
</userControl>

private void listBox_Resources_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            MessageBox.Show(listBox_Resources.SelectedIndex.ToString() + " " + listBox_Resources.Items.Count.ToString());
            listBox_Resources.SelectedIndex = 0;          
        }

кажется, что dataContextChanged запускается до заполнения элементов списка, потому что мой ящик сообщений в обработчике событий вернет мне счетчик предыдущих элементов списка. пожалуйста, помогите мне найти решение. спасибо

1 Ответ

3 голосов
/ 04 ноября 2010

Попробуйте это

private void listBox_Resources_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    EventHandler eventHandler = null;
    eventHandler = new EventHandler(delegate
    {
        if (listBox_Resources.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
        {
            listBox_Resources.SelectedIndex = 0;
            listBox_Resources.ItemContainerGenerator.StatusChanged -= eventHandler;
        }
    });
    listBox_Resources.ItemContainerGenerator.StatusChanged += eventHandler;
}

Если вы поставили точку останова в последней строке

listBox_Resources.ItemContainerGenerator.StatusChanged += eventHandler;

и посмотрите значение listBox_Resources.ItemContainerGenerator.Status в отладчике, которое он должен будет прочитать "ContainersGenerated».Если затем вы добавите точку останова в делегат EventHanler по адресу

if (listBox_Resources.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)

, вы должны увидеть, что «c_listBox.ItemContainerGenerator.Status = GeneratingContainers» в первый раз, а затем, когда он достигнет снова, это должен быть ContainersGenerated, а затем мы можемустановить SelectedIndex.Во всяком случае, это работает для меня.

...