2009-03-23 9 views
1

J'espérais que la réponse à my previous question pourrait m'aider avec celui-ci, mais ce n'était pas le cas. La situation initiale est à peu près la même:Trouver un parent dans wpf-treeview

<TreeView ItemsSource="{Binding Groups}" Name="tvGroups" AllowDrop="True"> 
      <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate ItemsSource="{Binding Participants}"> 
          <StackPanel Orientation="Horizontal" Drop="tvDrop" Tag="{Binding .}"> 
           <TextBlock Text="{Binding Name}" /> 
           <Button Tag="{Binding .}" Click="Button_Click_2"> 
            <Image Source="Resources/cross.png" /> 
           </Button> 
          </StackPanel> 
          <HierarchicalDataTemplate.ItemTemplate> 
           <DataTemplate> 
            <StackPanel Orientation="Horizontal" > 
             <TextBlock Text="{Binding Alias}" /> 
             <Button Tag="{Binding .}" Name="btnDeleteParticipants" Click="btnParticipants_Click" > 
              <Image Source="Resources/cross.png" /> 
             </Button> 
            </StackPanel> 
           </DataTemplate> 
          </HierarchicalDataTemplate.ItemTemplate> 
        </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
</TreeView> 

private void btnParticipants_Click(object sender, RoutedEventArgs e)//Probanten aus Gruppe entfernen 
     { 
      Participant p = ((sender as Button).Tag as Participant); 
      if (p == null) return; 
      //TODO: Raus bekommen in welcher Gruppe ich löschen will 

     } 

Je veux enlever Participant p d'un Group en cliquant sur le bouton (btnDeleteParticipants). J'ai essayé quelque chose comme celui-ci:

Control c = sender as Control; 
while (!(c is TreeViewItem)) 
    c = (c.Parent) as Control; 

Mais cela n'a pas fonctionné (ne demandez pas pourquoi, je ne suis pas sûr). Je pourrais trouver le Group en vérifiant s'il contient le Participant (lié à btnDeleteParticipants.Tag), mais cela interdirait aux participants d'être dans plus d'un groupe. Donc, des idées comment obtenir le bon Group?

Edit:

Groups = new ObservableCollection<Group>(); 
Participants = new ObservableCollection<Participant>(); 
+0

Vous trouverez peut-être [cet article] (http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx) par Josh Smith intéressant. – mostlytech

Répondre

1

sont les objets de groupes et participants?

Essayez d'utiliser ceci:

static TObject FindVisualParent<TObject>(UIElement child) where TObject : UIElement 
{ 
    if (child == null) 
    { 
    return null; 
    } 

    UIElement parent = VisualTreeHelper.GetParent(child) as UIElement; 

    while (parent != null) 
    { 
    TObject found = parent as TObject; 
    if (found != null) 
    { 
     return found; 
    } 
    else 
    { 
     parent = VisualTreeHelper.GetParent(parent) as UIElement; 
    } 
    } 

    return null; 
} 

Aussi, essayez d'utiliser le DataContext pour obtenir le participant et définir la variable à la TemplatedParent.

<Button Tag="{Binding RelativeSource={RelativeSource TemplatedParent}}" /> 

Puis cliquez

private void btnParticipants_Click(object sender, RoutedEventArgs e) 
{ 
    var button = sender as Button; 
    var p = button.DataContext as Participant; 
    if (p == null) return; 

    var t= FindVisualParent<TreeViewItem>(button); // get the Participants TreeViewItem 
    if (t == null) return; 
    var groupTreeItem = FindVisualParent<TreeViewItem>(t); // get the groups TreeViewItem 
    if (groupTreeItem == null) return; 
    var group = groupTreeItem.DataContext as Group; 
    group.Participants.Remove(p); 
} 
+0

sry, je ne vois pas comment utiliser cette méthode. quoi de 'this' avant le ParamterType (** cet article ** TreeViewItem)? Je n'ai pas un TreeViewItem à utiliser en tant que paramètre. –

+0

C'est une méthode dite d'extension. Vous pouvez l'appeler sur un TReeViewItem comme s'il s'agissait d'une méthode déclarée sur TVI. – Joey

+0

votre XAML ne fonctionne pas. J'ai besoin d'ajouter un chemin. (Et quoi de neuf avec cet espace de noms asp?) –

Questions connexes