1

コンボボックス内にツリービューを実装しようとしています。基本的に、折りたたむとコンボボックスとして表示されますが、展開するとコンボボックス内にツリービューが表示されます。ユーザーがノードをクリックすると、折りたたまれたコンボ ボックスに表示されます。私はこれまでのところこれを機能させています。

私が抱えている問題は、このコンボ ボックスがロードされたときに c# からデフォルト値を表示するにはどうすればよいかということです。私はアイデアが不足しているので、みんなを助けてください:)

前もって感謝します。

データ テンプレート

    <DataTemplate x:Key="TreeViewExpanded" >

        <StackPanel>
            <TreeView x:Name="DPointTree" Margin="5" ItemsSource="{Binding Datapoint}" 
                              Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBox}}}"
                              >
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Field}">
                        <TextBlock Text="{Binding Name}"/>
                                <HierarchicalDataTemplate.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding}"/>
                                    </DataTemplate>
                                </HierarchicalDataTemplate.ItemTemplate>
                            </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>
        </StackPanel>
        <DataTemplate.Triggers>
            <DataTrigger Binding = "{Binding Path=SelectedFieldName, Mode=TwoWay}" Value = "">
                <Setter Property = "Visibility"  Value = "Collapsed"/>
            </DataTrigger>
        </DataTemplate.Triggers>
</DataTemplate>

ここにXamlがあります

 <ComboBox Name="cmbFieldName" Width="150" Background="White" ItemsSource="{Binding}" SelectedItem="{Binding SelectedFieldName , Mode=TwoWay}" >
            <ComboBox.ItemTemplateSelector>
                <local:TreeViewSelector/>
            </ComboBox.ItemTemplateSelector>
        </ComboBox>

これに渡される DataSet は次のとおりです。

Datapoint _datapoint2 = new Datapoint();
        _datapoint2.Name = "Alpha";
        _datapoint2.FieldID.Add("Contains Elements");
        _datapoint2.Field.Add("1 Year");
        _datapoint2.Field.Add("2 Year");
        _datapoint2.Field.Add("3 Year");
4

2 に答える 2

0

きれいではありませんが、ツリー内のノードを選択するために機能します

// in code behind after the tree is declared, e.g. after InitializeComponent();
SynchronizationContext.Current.Post(delegate
{
    // expand the tree to the selected node after loading
    treeView.ExpandAll(); // or if path is known treeView.ExpandPath(...);
    SynchronizationContext.Current.Post(delegate
    {
        treeView.GetContainerFromItem(root.Children[0]).IsSelected = true;
    }, null);
}, null);
于 2012-08-23T06:09:34.780 に答える
0

これを試して:

private void TreeView_Loaded(object sender, RoutedEventArgs e)
        {
            TreeView areaTreeView = sender as TreeView;

            // Expand the treeview
            if (areaTreeView != null)
            {
                ExpandCollapseTreeNodes(areaTreeView, true);
            }
        }



public static void ExpandCollapseTreeNodes(ItemsControl parentContainer, bool isExpanded)
        {
            foreach (Object item in parentContainer.Items)
            {
                TreeViewItem currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                if (currentContainer != null) // && currentContainer.Items.Count > 0
                {
                    //expand the item
                    currentContainer.IsExpanded = isExpanded;                    

                    //if the item's children are not generated, they must be expanded
                    if (isExpanded && currentContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                    {
                        //store the event handler in a variable so we can remove it (in the handler itself)
                        EventHandler eh = null;
                        eh = new EventHandler(delegate
                        {
                            //once the children have been generated, expand those children's children then remove the event handler
                            if (currentContainer.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
                            {
                                ExpandCollapseTreeNodes(currentContainer, isExpanded);
                                currentContainer.ItemContainerGenerator.StatusChanged -= eh;
                            }
                        });

                        currentContainer.ItemContainerGenerator.StatusChanged += eh;
                    }
                    //otherwise the children have already been generated, so we can now expand those children
                    else
                    {
                        ExpandCollapseTreeNodes(currentContainer, isExpanded);
                    }
                }
            }
        }
于 2012-08-23T06:16:31.397 に答える