1

クラスListBoxのコレクションにバインドされたデータがあります。PersonCollection次に、タイプ のオブジェクトのデータ テンプレートを定義しました。データ テンプレートは、人物の名前用の とリストから人物を削除するを含むPersonで構成されています。まとめてとても素敵に見えます。DockPanelTextBlockButton

私が直面している問題は、データ テンプレートで定義されたボタンをクリックしたときに、リスト ボックスで選択した項目に到達 (および削除) できないことです。ボタンのハンドラーは次のとおりです。

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

最後に作成されたオブジェクトcontrolは ですnull。つまり、要素ツリーをさらに上に進むことができないため、リストとその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);
    }
}

もう 1 つの方法は、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を使用してビジュアル ツリーをたどることができます。

とはいえ、PersonItem がリストから Person を削除する方法を認識できるように、追加のコンテキスト情報を使用して PersonItem クラスで Person をラップできるかどうかを検討することもできます。私は時々このパターンを使用し、監視対象の ObservableCollection の変更に基づいてラッパー オブジェクトを自動的にインスタンス化する EncapsulatingCollection クラスを作成しました。

于 2010-11-30T23:14:05.993 に答える