1

我有一个ListBox绑定到我的PersonCollection班级集合的数据。接下来,我为 类型的对象定义了一个数据模板,Person其中DockPanel包括一个包含TextBlock人名的 a 和Button从列表中删除该人的 a。它看起来非常好。

我面临的问题是,当我单击数据模板中定义的按钮时,我无法到达列表框中的选定项目(并将其删除)。这是按钮的处理程序:

private void RemovePersonButton_Click(object sender, RoutedEventArgs e)
{
    Button clickedButton = (Button)e.Source;
    DockPanel buttonPanel = (DockPanel)clickedButton.Parent;
    Control control = (Control)button.Parent;
}

最后创建的对象controlnull,即我无法在元素树上进一步前进,因此我无法到达列表及其SelectedItem. 这里要注意的重要一点是,不能简单地通过调用从列表中获取所选项目,因为我在窗口中有多个列表,所有这些列表都实现相同的数据模板,即共享相同的事件处理程序删除按钮。

我会很感激我能得到的所有帮助。谢谢。

4

2 回答 2

3

如果我正确理解了这个问题,我认为您将能够从按钮的 DataContext 中获取 Person

private void RemovePersonButton_Click(object sender, RoutedEventArgs e) 
{
    Button clickedButton = (Button)e.Source; 
    Person selectedItem = clickedButton.DataContext as Person;
    if (selectedItem != null)
    {
        PersonCollection.Remove(selectedItem);
    }
}

另一种方法是在 VisualTree 中找到 ListBox

private void RemovePersonButton_Click(object sender, RoutedEventArgs e) 
{
    Button clickedButton = (Button)e.Source; 
    ListBox listBoxParent = GetVisualParent<ListBox>(clickedButton );
    Person selectedItem = listBoxParent.SelectedItem as Person;
    //...
}

public T GetVisualParent<T>(object childObject) where T : Visual
{
    DependencyObject child = childObject as DependencyObject;
    while ((child != null) && !(child is T))
    {
        child = VisualTreeHelper.GetParent(child);
    }
    return child as T;
}
于 2010-11-30T23:09:08.463 回答
0

您可以尝试使用VisualTreeHelper.GetParent来遍历可视化树,而不是依赖逻辑父级。

也就是说,您可能会考虑是否可以将 Person 包装在 PersonItem 类中,并带有额外的上下文信息,以便 PersonItem 知道如何从列表中删除 Person。我有时会使用这种模式,并编写了一个 EncapsulatingCollection 类,该类会根据受监控的 ObservableCollection 中的更改自动实例化包装器对象。

于 2010-11-30T23:14:05.993 回答