如何选择已使用XmlDataProvider填充的WPF TreeViewItem?

问题描述

| 我有一个WPF
TreeView
,它是在运行时从XML文件填充的。我单击一个按钮,然后出现一个“ 1”框,然后选择一个XML文件。然后将XML文件加载到“ 0”中。我使用了ѭ3和一些ѭ4来加载XML。 我已经在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 XPath=@Name}\"></TextBlock>            
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate DataType=\"Phase\" ItemsSource=\"{Binding}\">
        <TextBlock Text=\"{Binding XPath=@Name}\"></TextBlock>
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate DataType=\"Trigger\" ItemsSource=\"{Binding}\">
        <TextBlock Text=\"{Binding XPath=@Name}\"></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\"  VerticalAlignment=\"Top\" Width=\"431\">
        <TreeViewItem ItemsSource=\"{Binding Source={StaticResource MEIInformation},XPath=*}\" Header=\"Suites\"></TreeViewItem>
    </TreeView>                           
</Grid>
</Window>
代码最简洁的是:
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>
我只想参考该项目,以便可以在该项目之后添加新项目。 @市场 我已经像这样更改了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建议... :(     

解决方法

这是我发现从
xmlElement
获得way10 I值的方法。 考虑以下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\"
                       Text=\"{Binding XPath=@name}\"
                       FontSize=\"18\"
                       FontFamily=\"BankGothic Md BT\"
                       Foreground=\"#FF355CE5\"/>
        </StackPanel>
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate DataType=\"Setor\"
                              ItemsSource=\"{Binding XPath=./*}\">
        <StackPanel Orientation=\"Horizontal\">
            <TextBlock Margin=\"5,0\"
                       Text=\"{Binding XPath=@name}\"
                       FontWeight=\"Bold\" />
        </StackPanel>
    </HierarchicalDataTemplate>
    <HierarchicalDataTemplate DataType=\"User\">
        <StackPanel Orientation=\"Horizontal\">
            <Image Source=\"{Binding XPath=@source}\"
                   Height=\"15\"></Image>
                <TextBlock Margin=\"5,0\"
                       Text=\"{Binding XPath=@name}\"
                       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\"
              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>
    ,我看不到是什么激发了您的
DoSomething
处理程序,我猜它响应了
Click
事件。 如果单击项目模板的元素,则可能无法获得正确的发送者参数。 您可以将发送方转换为
UIElement
,然后访问其
DataContext
,它应该是XML元素之一。 另一种方法是对treeview的
SelectionChanged
事件作出反应,这将在事件参数中提供treview项。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...