2010-04-27 6 views
0

Comment obtenir Treeviewitem lorsque je clique sur BTNAddProvince? Dans mon cas parent de bouton est stackpanel, et je ne peux pas obtenir parent de stackpanel (est-ce une bonne façon d'obtenir le noeud?).Obtention de TreeViewItem dans WPF

Des idées?

<HierarchicalDataTemplate DataType="{x:Type MyService:Region}" 
            ItemsSource="{Binding Path=ListOfProvinces}"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock TextAlignment="Justify" VerticalAlignment="Center" Text="{Binding Path=Name}"/> 
        <TextBlock TextAlignment="Justify" VerticalAlignment="Center" Text=" H:"/> 
        <TextBlock TextAlignment="Justify" VerticalAlignment="Center" Text="{Binding Path=NumberOfHotels}"/> 
        <TextBlock TextAlignment="Justify" VerticalAlignment="Center" Text=" "/> 
        <Button Name="BTNAddProvince" Height="20" Content="+" Click="BTNAddProvince_Click"></Button> 
       </StackPanel> 
         </HierarchicalDataTemplate> 

Répondre

1

Je vous suggère d'utiliser une conception basée MVVM pour votre TreeView (voir http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx pour un article comment faire). Puis reliez votre bouton à la commande de ViewModel. De cette façon, vous appelez la commande sur le ViewModel de l'élément, où vous pouvez ensuite exécuter votre logique spécifique basée sur l'élément.

1

Vous pouvez obtenir le TreeViewItem de cette façon:

public New() 
{ 
    
    // This call is required by the designer. 
    InitializeComponent(); 
    
    _Items.Add(new Company { Name = "Company1", NumberOfHotels = 5 }); 
    _Items.Add(new Company { Name = "Company2", NumberOfHotels = 15 }); 
    _Items.Add(new Company { Name = "Company3", NumberOfHotels = 30 }); 
    
        
    tvItems.ItemsSource = _Items; 
} 

private void BTNAddProvince_Click(System.Object sender, System.Windows.RoutedEventArgs e) 
{ 
    
    Button button = sender as Button; 
    if (button == null) return;     
        
    TreeViewItem treeViewItem = GetVisualParent<TreeViewItem>(button); 
} 

public static T GetVisualParent<T>(Visual referencedVisual) where T : Visual 
{ 
    
    Visual parent = referencedVisual; 
    
    while (parent != null && !object.ReferenceEquals(parent.GetType, typeof(T))) { 
        parent = VisualTreeHelper.GetParent(parent) as Visual; 
    } 
    
    var parent1 = VisualTreeHelper.GetParent(referencedVisual); 
    
        
    return parent as T; 
} 
+0

object.ReferenceEquals (parent.GetType, typeof (T)) <- groupe de méthode type d'argument est incessible au paramètre type « objet ' et pour waht vous utilisez parent1? – user278618

1
private void BTNAddProvince_Click(System.Object sender, System.Windows.RoutedEventArgs e) 
{  
    Button button = sender as Button; 
    Province p = button.DataContext as Province; 
    TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromItem(p) as TreeViewItem;    
} 
+0

+1 pour treeView.ItemContainerGenerator.ContainerFromItem (p), juste ce dont j'avais besoin pour obtenir l'arbre treeview de l'élément de données lié, merci. – RobJohnson

Questions connexes