2010-11-04 2 views
2

У меня есть список в userControl, и я хочу выбрать первый элемент в списке, когда меняет datacontext моего userControl. (ItemsSource от списка является Привязать к UserControl DataContext:WPF listBox dataContextChanged

<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 обжигают до элементов ListBox заполняется, потому что моя MessageBox в EventHandler вернет мне кол предыдущих пунктов ListBox , пожалуйста, помогите мне находя. решение. благодаря

ответ

3

Попробуйте

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 , Во всяком случае, это работает на меня.

+0

спасибо за помощь, но она не работает. – Asha

+0

Странно, это работает для меня. Обновлен мой пример. –

+0

Я нашел проблему, я обновлял datacontext после того, как выбор listBox был изменен вручную, но когда я прокомментировал эту строку, ваш код работал.cheers – Asha