簡體   English   中英

如何使用 XmlDataProvider 填充的 select WPF TreeViewItem?

[英]How to select WPF TreeViewItem which has been populated using XmlDataProvider?

我有一個 WPF TreeView已在運行時從 XML 文件填充。 我單擊一個按鈕並出現一個FileDialog框,然后我 select 一個 XML 文件。 然后 XML 文件被加載到TreeView中。 我使用了XmlDataProvider和一些HierarchicalDataTemplate來加載 XML。

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

我該如何解決這個問題?

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

我只想獲得該項目的參考,以便我可以在該項目之后添加新項目。


@Mart我已經像這樣更改了xaml上的treeview ...(添加了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 建議...... :(

這是我發現獲取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 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,0,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,0,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,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 元素之一。

另一種方法是對樹視圖的SelectionChanged事件做出反應,這將為您提供事件 arguments 中的查看項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM