简体   繁体   中英

WPF TreeView ItemTemplate not applied to TreeViewItem

I have a TreeView and manually add two items ( TreeViewItem ) to it. And I want to apply ItemTemplate to those two items but it seems like the ItemTemplate is not applied to them. Actually I have deeper levels in the tree (so item1 and item2 each has a collection as ItemsSource , and there are more HierarchicalDataTemplates for them). But to demonstrate the first Template NOT being applied to the first-level items, I simplified the example. Below are the behind codes.

        TreeViewItem item1 = new TreeViewItem();
        TreeViewItem item2 = new TreeViewItem();
        trvRecordList.Items.Add(item1);
        trvRecordList.Items.Add(item2);

And here are my xaml codes. The HierarchicalDataTemplate is written in a correct place.

                      <HierarchicalDataTemplate x:Key="My_Template">                                                      
                            <StackPanel Orientation="Horizontal">
                                <Image Source="Images/Star_Blue.png"
                                       Margin="0,0,4,0" Height="16" Width="16"/>
                                <TextBox Text="abcd"/>
                            </StackPanel>
                        </HierarchicalDataTemplate>


                      <TreeView Name="trvRecordList" Margin="2"
                              ItemTemplate="{StaticResource My_Template}">                           
                     </TreeView>

Since you are adding a list of TreeViewItem objects to your TreeView , My_Template will not be applied to it. If you check your output window, you would be getting an error as shown below

System.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type; Type='TreeViewItem'

The solution is to apply My_Template to the ItemTemplate property of the TreeViewItem itself. Below are the modifications I've done to your code

        TreeViewItem item1 = new TreeViewItem();
        TreeViewItem item2 = new TreeViewItem();
        item1.Items.Add("");
        item1.Items.Add("");
        item1.ItemTemplate = FindResource("My_Template") as HierarchicalDataTemplate;

        item2.Items.Add("");
        item2.Items.Add("");
        item2.ItemTemplate = FindResource("My_Template") as HierarchicalDataTemplate;

        trvRecordList.Items.Add(item1);
        trvRecordList.Items.Add(item2);

Go through the below link to learn more about HierarchicalDataTemplate

http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-by-step.aspx

Edit:

If you want to apply My_Template to the TreeView then try this code.

        trvRecordList.Items.Add("");
        trvRecordList.Items.Add("");

The ItemTemplate is for data objects. Check the remarks for ItemTemplate on MSDN .

TreeViewItem is container generated for each data item and is styled thru ItemContainerTemplate . ItemContainerTemplate on MSDN

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM