2011-05-26 37 views
1

我有一個WPF TreeView已經在運行時從XML文件填充。我點擊一個按鈕,一個FileDialog框出現,然後我選擇一個XML文件。然後將XML文件加載到TreeView中。我使用了XmlDataProvider和一些HierarchicalDataTemplate來加載XML。如何選擇已使用XmlDataProvider填充的WPF TreeViewItem?

我已經添加了一個TreeView的動作處理程序,但是當我選擇該TreeView的一個項目時,我無法找到該項目的任何引用。我只找到第一個元素的參考。

我該如何解決這個問題?

的XAML是:

<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> 

和代碼snippest是:

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> 

我只是想有該項目的參考,這樣我可以在該項目後添加新項目。


@Mart 我已經改變了在這樣的XAML樹視圖...(添加SelectedItemChanged = 「DoSomething的」)......

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

和C#代碼現在... ...

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!");      
     }  

但是根本沒有運氣。我還沒有明白烏爾的UIElement sugestion ... :(

+0

能否請您在這裏粘貼代碼段以便我們可以找出究竟出了什麼問題 – 2011-05-26 11:36:10

+0

這個xml是:這個xml文件是: <?XML版本= 「1.0」 編碼= 「ISO-8859-1」?> <案例名稱= 「讓價」> <階段名稱= 「一月」> \t \t <觸發器名稱=」訂單號JAN001 「> \t \t \t \t <觸發器名稱=」 訂單#JAN002 「> \t \t <階段名稱=」 二月 「> \t \t <觸發器名稱=」 訂單#FEB0 01 「> \t \t <案例名稱=」 約翰·P格蘭特 「> <階段名稱=」 四五 「> \t \t <觸發器名稱=」 訂單#APR001" > \t \t \t \t <觸發器名稱= 「訂單#APR002」> \t \t \t <相位名稱= 「月」> \t \t <觸發器名稱= 「訂單#MAY001」> \t \t \t 2011-05-26 12:16:26

回答

0

我看不出有什麼觸發你DoSomething處理程序,我想它響應一個Click事件。

如果是的一個元素上的點擊項模板,您可能不會得到正確的發送參數。

,就可以把發送到UIElement,然後訪問其DataContext這應該是你的XML元素之一。

另一種方式是向反應treeview的SelectionChanged事件,那無線在事件論證中給你trevel項目。

+0

實際上this.trv.MouseRightButtonUp + =新MouseButtonEventHandler(DoSomething的);觸發DoSomething方法.... – 2011-05-27 04:32:40

+0

這樣做並不會爲您提供樹視圖項目作爲上下文,而是樹視圖。您可以通過trv.SelectedItem訪問您的項目(如果它被選中(右擊不一定選擇該項目))。 – Mart 2011-05-27 07:44:39

+0

在您的SelectionChanged事件處理程序中,放置一個斷點並觀察發件人對象和e.Source的類型。這些對象取決於你如何放置你的處理程序。然後正確施放它們並按照我上面的建議。 – Mart 2011-05-27 07:47:49

1

這是我發現獲得selectedTreeViewItem值的方式,我從xmlElement得到它。

鑑於此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> 

與此C#代碼隱藏:

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> 

,這是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

供將來參考:請注意,TreeViewItem.Selected不會通過智能感知顯示。 – Jake1164 2014-11-10 13:30:19