WPF listBox dataContextChanged

时间:2010-11-04 12:03:13

标签: wpf data-binding datacontext

我在userControl中有一个列表框,我想在我的userControl的datacontext发生更改时选择列表框中的第一个项目。 (listbox的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,因为eventhandler中的messagebox将返回前面列表框项的计数。 请帮我找到解决方案。 感谢

1 个答案:

答案 0 :(得分: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。无论如何,这对我有用。