2011-05-26 1 views
1

J'ai un WPF TreeView qui a été rempli à partir d'un fichier XML lors de l'exécution. Je clique sur un bouton et une boîte FileDialog apparaît, puis je sélectionne un fichier XML. Ensuite, le fichier XML est chargé dans le TreeView. J'ai utilisé un XmlDataProvider et quelques HierarchicalDataTemplate s pour charger le XML.Comment sélectionner WPF TreeViewItem qui a été rempli à l'aide de XmlDataProvider?

J'ai ajouté un gestionnaire d'action avec TreeView, mais lorsque je sélectionne un élément de ce TreeView, je ne trouve aucune référence pour cet élément. Je ne trouve que la référence du premier élément.

Comment puis-je résoudre ce problème?

Le XAML est:

<Window x:Class="Demo2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="600" Width="800"> 
<Window.Resources> 
    <XmlDataProvider x:Key="MEIInformation" XPath="/MEI" /> 
    <HierarchicalDataTemplate DataType="Case" ItemsSource="{Binding}"> 
     <TextBlock Text="{Binding [email protected]}"></TextBlock>    
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="Phase" ItemsSource="{Binding}"> 
     <TextBlock Text="{Binding [email protected]}"></TextBlock> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="Trigger" ItemsSource="{Binding}"> 
     <TextBlock Text="{Binding [email protected]}"></TextBlock> 
    </HierarchicalDataTemplate> 
</Window.Resources> 
<Grid> 
    <ToolBarTray> 
     <ToolBar>     
      <Button ToolTip="Open Test Suite" Click="OpenTestSuite"> 
       <Image Source="Icons/open.png"></Image> 
      </Button>     
     </ToolBar> 
    </ToolBarTray> 
    <TreeView x:Name="trv" FontSize="14" Height="518" HorizontalAlignment="Left" Margin="6,31,0,0" VerticalAlignment="Top" Width="431"> 
     <TreeViewItem ItemsSource="{Binding Source={StaticResource MEIInformation}, XPath=*}" Header="Suites"></TreeViewItem> 
    </TreeView>       
</Grid> 
</Window> 

Et le code snippest est:

public partial class MainWindow : Window 
{  
    public MainWindow() 
    { 
     InitializeComponent();  
     this.trv.MouseRightButtonUp+=new MouseButtonEventHandler(DoSomething);  
    }  

    private void OpenTestSuite(object sender, RoutedEventArgs e) 
    { 
     XmlDocument xmlDocument = new XmlDocument(); 
     OpenFileDialog open = new OpenFileDialog(); 
     open.Filter = "XML Files (*.xml)|*.xml"; 
     if (open.ShowDialog() == true) 
     { 
      xmlDocument.Load(open.FileName); 
      XmlDataProvider dataProvider = this.FindResource("MEIInformation") as XmlDataProvider; 
      dataProvider.Document = xmlDocument;   
     } 
    }   

    private void DoSomething(object sender, MouseEventArgs e) 
    { 
     MessageBox.Show("Do Something in TreeView!"); 
     TreeViewItem childItem = e.Source as TreeViewItem; 
     if (childItem != null) 
     { 
      MessageBox.Show(childItem.Header.ToString()); // or MessageBox.Show(childItem.toString); 
      childItem.IsSelected = true; 
     } 
     else 
      MessageBox.Show("No Selected Item!");      
    }     
} 

XML

<?xml version="1.0" encoding="ISO-8859-1"?> 
<MEI> 
    <Case Name="Jean Price"> 
     <Phase Name="January"> 
      <Trigger Name="Order # JAN001"></Trigger> 
      <Trigger Name="Order # JAN002"></Trigger> 
     </Phase> 
     <Phase Name="February"> 
      <Trigger Name="Order # FEB001"></Trigger> 
     </Phase> 
    </Case> 
    <Case Name="John P Grant"> 
     <Phase Name="April"> 
      <Trigger Name="Order # APR001"></Trigger> 
    <!-- ... --> 
</MEI> 

Je veux juste avoir une référence de cet élément pour que je puisse ajouter un nouvel élément après cet élément.


@Mart J'ai changé la vue arborescente sur le XAML comme ça ... (ajouté SelectedItemChanged = "DoSomething") ...

<TreeView SelectedItemChanged="DoSomething"....../>  

Et le code C# est maintenant ... ....

private void DoSomething(object sender, EventArgs e) 
     { 
      MessageBox.Show("Do Something in TreeView!");   

      TreeViewItem childItem = sender as TreeViewItem;       
      if (childItem != null) 
      { 
       MessageBox.Show(childItem.Header.ToString()); 
       childItem.IsSelected = true; 
       MessageBox.Show("It Works!"); 
      } 
      else 
       MessageBox.Show("No Selected Item!");      
     }  

mais il n'y a pas de chance du tout. Et je ne l'ai pas compris ur UIElement Sugestion ... :(

+0

Pouvez-vous s'il vous plaît coller l'extrait de code ici afin que nous puissions savoir exactement ce qui s'est passé –

+0

le xml est: Le fichier xml est: \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t

Répondre

0

Je ne vois pas ce que vous congédie gestionnaire DoSomething, je suppose qu'il répond à un événement Click.

S'il est un clic sur un élément de la modèle d'élément, vous ne pouvez pas obtenir le paramètre de l'expéditeur correct.

vous pouvez lancer l'expéditeur à un UIElement puis accéder à son DataContext qui devrait être l'un de vos éléments XML.

l'autre façon est de réagir à la événement SelectionChanged treeview, que wi Je vais vous donner l'élément Treview dans les arguments de l'événement.

+0

En fait this.trv.MouseRightButtonUp + = new MouseButtonEventHandler (DoSomething); déclenche la méthode DoSomething .... –

+0

Cette action ne vous donnera pas l'élément treeview en tant que contexte, mais l'arborescence. Vous pouvez accéder à votre article s'il est sélectionné (un clic droit ne sélectionne pas nécessairement l'article) avec trv.SelectedItem. – Mart

+0

Dans votre gestionnaire d'événements SelectionChanged, placez un point d'arrêt et observez le type de l'objet émetteur et de e.Source. Ces objets dépendent de la façon dont vous avez placé vos gestionnaires. Puis jetez-les correctement et suivez ma suggestion ci-dessus. – Mart

1

C'est ainsi que j'ai trouvé la valeur selectedTreeViewItem, je l'ai eu de xmlElement.

Vu ce code XAML:

<i> 
<Window.Resources> 
    <HierarchicalDataTemplate DataType="Filial" 
           ItemsSource="{Binding XPath=./*}"> 
     <StackPanel Orientation="Horizontal"> 
      <Image Source="/WpfClient;component/Images/image4.png" 
        Height="20"></Image> 
      <TextBlock Margin="5,0,0,0" 
         Text="{Binding [email protected]}" 
         FontSize="18" 
         FontFamily="BankGothic Md BT" 
         Foreground="#FF355CE5"/> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="Setor" 
           ItemsSource="{Binding XPath=./*}"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Margin="5,0,0,0" 
         Text="{Binding [email protected]}" 
         FontWeight="Bold" /> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="User"> 
     <StackPanel Orientation="Horizontal"> 
      <Image Source="{Binding [email protected]}" 
        Height="15"></Image> 
       <TextBlock Margin="5,0,0,0" 
         Text="{Binding [email protected]}" 
         FontStyle="Italic" /> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
    <XmlDataProvider x:Key="xmlDP" 
        Source="Contatos.xml" 
        XPath="/Contatos/Filial"></XmlDataProvider> 
</Window.Resources> 
<Grid Width="Auto" 
     Height="Auto"> 
    <TreeView Name="tv" 
       ItemsSource="{Binding }" 
       DataContext="{StaticResource xmlDP}" 
       Margin="0,0,0,0" 
       TreeViewItem.Selected="tv_Selected"> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="TreeViewItem"> 
       <Setter Property="TreeViewItem.IsExpanded" 
         Value="True" /> 
      </Style> 
     </TreeView.ItemContainerStyle> 
    </TreeView> 
</Grid> 
</i> </pre> 

et ce C# behind:

private void tv_Selected(object sender, RoutedEventArgs e) 
    { 
     System.Xml.XmlElement xmlElement= (XmlElement)tv.SelectedItem; 

     string mySelectedValue = xmlElement.Attributes[0].Value.ToString(); 
     MessageBox.Show(mySelectedValue , "SelectedTreeValue", MessageBoxButton.OK, MessageBoxImage.Information); 
    } 
    </i> 

et c'est le fichier xml:

<i> 
<?xml version="1.0" encoding="utf-8" ?> 
    <Contatos> 
    <Filial name="Firm"> 
     <Setor name="Sector 1"> 
     <User name="user1" source="/WpfClient;component/Images/user.png"></User> 
     <User name="user2" source="/WpfClient;component/Images/user.png"></User> 
     <User name="user3" source="/WpfClient;component/Images/admin.png"></User> 
     </Setor> 
    <Setor name="Sector40"> 
     <User name="user43" source="/WpfClient;component/Images/admin.png"></User> 
     <User name="user44" source="/WpfClient;component/Images/user.png"></User> 
     <User name="user45" source="/WpfClient;component/Images/user.png"></User> 
     <User name="user46" source="/WpfClient;component/Images/user.png"></User> 
    </Setor> 
    </Filial> 
</Contatos> 
</i> 
+0

Pour référence future: Sachez simplement que TreeViewItem.Selected ne s'affiche pas via intellisense. – Jake1164

Questions connexes