问题描述
|
我有一个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项。