Search code examples
wpfxamltreeviewdatatemplate

How to get TreeViewItem's ContextMenu, having TreeView as a DataTemplate


I have a TreeView in a data template like this :

    <DataTemplate DataType="{x:Type MainFavoriteItems}">
    <TreeView BorderThickness="0">
       <TreeViewItem Header="First Header" ItemsSource="{Binding FavItems}" ItemTemplate="{StaticResource item_template}"/>
       <TreeViewItem Header="Second Header" ../>
       <TreeViewItem Header="Third Header" ../>
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}">
        <Setter Property="ContextMenu" Value="{Binding GetMenu}}"/>  // DO not work
    </TreeView.ItemContainerStyle>
    </TreeView>
    </DataTemplate>



internal class MainFavoriteItems{
public IReadOnlyList<Info> FavItems
    {
      get
      {
            List<Info> items = new List<Info>();
            items.Add(new InnerViewModel("1"));
            items.Add(new InnerViewModel("2"));
            NotifyPropertyChanged(() => FavItems);
        return items;
      }
    }
}

public class InnerViewModel
{
public string Id;
public System.Windows.Controls.ContextMenu GetMenu => new CustomContextMenu();
...
}

When i run it, headers and its children appears fine, but inner item's right-click ContextMenu doesn't showup, and its xaml output error says .. GetMenu property not found on object 'MainFavoriteItems' .. What am i doing wrong !? Thanks.


Solution

  • Your sample code doesn't even compile but you should set the ItemContainerStyle of the TreeViewItem with the ItemsSource for the binding to work:

    <TreeViewItem Header="First Header" ItemsSource="{Binding FavItems}"
                                        ItemTemplate="{StaticResource item_template}">
        <TreeViewItem.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}">
                <Setter Property="ContextMenu" Value="{Binding GetMenu}"/>
            </Style>
        </TreeViewItem.ItemContainerStyle>
    </TreeViewItem>
    <TreeViewItem Header="Second Header" />
    <TreeViewItem Header="Third Header" />