获取ComboBoxItem所在的ComboBox

时间:2011-04-27 07:36:44

标签: wpf combobox

我需要找到ComboBoxItem所在的ComboBox。

在代码隐藏中,我在单击ComboBoxItem时捕获一个事件,但我不知道特定ComboBoxItem所属的几个ComboBox中的哪一个。我如何找到ComboBox?

通常,您可以使用LogicalTreeHelper.GetParent()并遍历ComboBoxItem中的逻辑树以查找ComboBox。但这仅在ComboBoxItems手动添加到ComboBox时才有效,而不是在将项目应用于带有数据绑定的ComboBox时。使用数据绑定时,ComboBoxItems没有将ComboBox作为逻辑父项(我不明白为什么)。

有什么想法吗?

更多信息:

下面是一些重构我的问题的代码(不是我的实际代码)。如果我将数据绑定ComboBoxItems更改为手动设置(在XAML中),变量“comboBox”将被设置为正确的ComboBox。现在comboBox只是null。

XAML:

<ComboBox Name="MyComboBox" ItemsSource="{Binding Path=ComboBoxItems, Mode=OneTime}" />

代码隐藏:

public MainWindow()
{
    InitializeComponent();

    MyComboBox.DataContext = this;
    this.PreviewMouseDown += MainWindow_MouseDown;
}

public BindingList<string> ComboBoxItems
{
    get
    {
        BindingList<string> items = new BindingList<string>();
        items.Add("Item E");
        items.Add("Item F");
        items.Add("Item G");
        items.Add("Item H");
        return items;
    }
}

private void MainWindow_MouseDown(object sender, MouseButtonEventArgs e)
{
    DependencyObject clickedObject = e.OriginalSource as DependencyObject;
    ComboBoxItem comboBoxItem = FindVisualParent<ComboBoxItem>(clickedObject);
    if (comboBoxItem != null)
    {
        ComboBox comboBox = FindLogicalParent<ComboBox>(comboBoxItem);
    }
}

//Tries to find visual parent of the specified type.
private static T FindVisualParent<T>(DependencyObject childElement) where T : DependencyObject
{
    DependencyObject parent = VisualTreeHelper.GetParent(childElement);
    T parentAsT = parent as T;
    if (parent == null)
    {
        return null;
    }
    else if (parentAsT != null)
    {
        return parentAsT;
    }
    return FindVisualParent<T>(parent);
}

//Tries to find logical parent of the specified type.
private static T FindLogicalParent<T>(DependencyObject childElement) where T : DependencyObject
{
    DependencyObject parent = LogicalTreeHelper.GetParent(childElement);
    T parentAsT = parent as T;
    if (parent == null)
    {
        return null;
    }
    else if(parentAsT != null)
    {
        return parentAsT;
    }
    return FindLogicalParent<T>(parent);
}

1 个答案:

答案 0 :(得分:18)

这可能就是你要找的东西:

var comboBox = ItemsControl.ItemsControlFromItemContainer(comboBoxItem) as ComboBox;

我喜欢方法名称的描述性。


另外,还有一些其他有用的方法可以在属性ItemsControl.ItemContainerGenerator中找到,它可以让你获得与模板化数据相关联的容器,反之亦然。

另一方面,你通常应该使用其中任何一个,而是实际使用数据绑定。