【问题标题】:Silverlight 4 : TreeView/ HierarchicalDataTemplate/ Get Selected Node/ Leaf IssueSilverlight 4:TreeView/HierarchicalDataTemplate/获取选定节点/叶子问题
【发布时间】:2011-07-07 14:15:22
【问题描述】:
<sdk:TreeView x:Name="tvPageManager" SelectedItemChanged="tvPageManager_SelectedItemChanged" Style="{StaticResource PageManagerStyle}"                                       
                        ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Auto">
                        <sdk:TreeView.ItemTemplate>
                            <sdk:HierarchicalDataTemplate ItemsSource="{Binding KeyPoints, Mode=TwoWay}">
                                <StackPanel Orientation="Horizontal">
                                    <ToolTipService.ToolTip>
                                        <ToolTip Content="{Binding PageName}" Style="{StaticResource ToolTipStyle}"/>
                                    </ToolTipService.ToolTip>
                                    <Image x:Name="imgPageIcon" Source="{Binding PageIconImage}" Style="{StaticResource PageIconStyle}" MouseLeftButtonDown="imgPageIcon_MouseLeftButtonDown" Tag="{Binding BurstPageId, Mode=TwoWay}" />
                                    <TextBlock x:Name="tbkLiteralTextPage" Text="Page " Style="{StaticResource PageNameLiteralTextBlockStyle}" />
                                    <TextBox x:Name="tbPageName" Text="{Binding PageName, Mode=TwoWay}" Style="{StaticResource PageNameTextBoxStyle}" TextChanged="tbPageName_TextChanged" />
                                </StackPanel>
                                <sdk:HierarchicalDataTemplate.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <Image x:Name="imgKeypointIcon" Source="../Assets/Images/bullet_yellow.png" Style="{StaticResource KeypointIconStyle}"/>
                                            <TextBlock x:Name="tbkKeypointTitle" Text="{Binding Title, Mode=TwoWay}" Style="{StaticResource KeypointNameTextBlockStyle}"  />
                                            <StackPanel x:Name="spnlMoveImages" Orientation="Horizontal" HorizontalAlignment="Right" Width="30">
                                                <Image x:Name="imgMoveUp" Source="../Assets/Images/up_arrow.png" Style="{StaticResource MoveIconsStyle}" MouseLeftButtonDown="imgMoveUp_MouseLeftButtonDown" Tag="{Binding KeyPointId}"/>
                                                <Image x:Name="imgMoveDn" Source="../Assets/Images/down_arrow.png" Style="{StaticResource MoveIconsStyle}" MouseLeftButtonDown="imgMoveDn_MouseLeftButtonDown" Tag="{Binding KeyPointId}"/>
                                            </StackPanel>
                                        </StackPanel>
                                    </DataTemplate>
                                </sdk:HierarchicalDataTemplate.ItemTemplate>
                            </sdk:HierarchicalDataTemplate>
                        </sdk:TreeView.ItemTemplate>
                    </sdk:TreeView>      

对于上述 XAML,我需要以编程方式知道哪个是选定节点或叶?

【问题讨论】:

    标签: silverlight hierarchicaldatatemplate


    【解决方案1】:

    您已经捕捉到选择事件“tvPageManager_SelectedItemChanged”,因此当前节点作为参数(e.NewValue)传递:

    private void tvPageManager_SelectionChanged(object sender, RoutedPropertyChangedEventArgs<Object> e)
    {
        //Perform actions when SelectedItem changes
        MessageBox.Show(((TreeViewItem) e.NewValue).Header.ToString());
    }
    

    【讨论】:

    • 抱歉不够具体。实际上我需要从 c# 代码中选择一个节点。场景:我在运行时插入/删除子节点,此时集合更改(树视图已绑定到它;this.tvPageManager.ItemsSource = burst.BurstPages)。因此,树视图中的选择(选定焦点)会发生变化。在成功完成子节点的添加/删除后,我需要再次设置它。
    • 啊,您要编写递归搜索,然后在所需的树节点上将 IsSelected 属性设置为 true。识别目标节点的方法是什么?标记值?文字?
    【解决方案2】:

    高科技魔术, 很抱歉没有充分解释我的问题,我已经找到了解决方案;

        private void ExpandNodeAndSelectChild()
        {
            if (branchSelector < 1 || leafSelector < 1)
                return;
    
            TreeViewItem item = null;
            int itemAtIndex = 0;
    
            //Update tree layout
            this.tvName.UpdateLayout();
    
            foreach (var branch in this.tvName.Items)
            {
                item = (this.tvName.GetContainerFromItem(this.tvName.Items[itemAtIndex]) as TreeViewItem);
                if (item != null && item.HasItems)
                {
                    if ((branch as Model.BranchBusinessObject).Id== branchSelector && (!item.IsExpanded))
                        item.IsExpanded = true;
    
                    foreach (var leaf in item.Items)
                    {
                        item = (this.tvName.GetContainerFromItem(leaf as Model.LeafBusinessObject) as TreeViewItem);
                        if (item != null && ((leaf as Model.LeafBusinessObject).Id== leafSelector))
                        {
                            item.IsSelected = true;
                            break;
                        }                        
                    }
                }
                itemAtIndex++;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多