如何在数据绑定项目控件中获取该项目的下一个兄弟?

时间:2011-06-01 01:29:35

标签: c# wpf

如何在可视化树中获取元素的下一个兄弟?这个元素是数据绑定ItemsSource的数据项。我的目标是在代码中访问兄弟(假设我可以访问元素本身),然后使用BringIntoView。

感谢。

1 个答案:

答案 0 :(得分:4)

例如,如果您的ItemsControlListBox,则元素将是ListBoxItem个对象。如果您有一个ListBoxItem而又想要列表中的下一个ListBoxItem,则可以使用ItemContainerGenerator API找到它:

public static DependencyObject GetNextSibling(ItemsControl itemsControl, DependencyObject sibling)
{
    var n = itemsControl.Items.Count;
    var foundSibling = false;
    for (int i = 0; i < n; i++)
    {
        var child = itemsControl.ItemContainerGenerator.ContainerFromIndex(i);
        if (foundSibling)
            return child;
        if (child == sibling)
            foundSibling = true;
    }
    return null;
}

以下是一些示例XAML:

<Grid>
    <ListBox Name="listBox">
        <ListBoxItem  Name="item1">Item1</ListBoxItem>
        <ListBoxItem Name="item2">Item2</ListBoxItem>
    </ListBox>
</Grid>

和代码隐藏:

void Window_Loaded(object sender, RoutedEventArgs e)
{
    var itemsControl = listBox;
    var sibling = item1;
    var nextSibling = GetNextSibling(itemsControl, sibling) as ListBoxItem;
    MessageBox.Show(string.Format("Sibling is {0}", nextSibling.Content));
}

导致:

Sibling MessageBox

如果ItemsControl是数据绑定的,这也有效。如果您拥有数据项(而不是相应的用户界面元素),则可以使用ItemContainerGenerator.ContainerFromItem API来获取初始同级。