在WPF TreeView中更改上下文菜单以获取数据

Jar*_*red 9 data-binding wpf treeview contextmenu hierarchicaldatatemplate

有没有办法在一个TreeView's中指定HierarchicalDataTemplate使用不同的ContextMenu取决于项目绑定的数据的属性?

例如,ContextMenu如果Item.IsFile为真则显示一个,如果为真则显示不同的一个Item.IsFolder,等等.

SMA*_*T_n 13

这是ListBox的示例,我认为您可以轻松修改它以使用TreeView.

XAML:

...

<Window.Resources>
    <ContextMenu x:Key="FileContextMenu">
        ...
    </ContextMenu>
    <ContextMenu x:Key="DirContextMenu">
        ...
    </ContextMenu>

    <local:ItemToContextMenuConverter x:Key="ContextMenuConverter" />        
</Window.Resources>

...

<ListBox x:Name="SomeList">
    <ListBox.ItemTemplate>
        <DataTemplate>                          
            <Label Content="{Binding Path=Name}" ContextMenu="{Binding Converter={StaticResource ContextMenuConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

码:

class Item
{
    public string Name { get; set; }
    public bool IsFile { get; set; }
}

[ValueConversion(typeof(Item), typeof(ContextMenu))]
public class ItemToContextMenuConverter : IValueConverter
{
    public static ContextMenu FileContextMenu;
    public static ContextMenu DirContextMenu;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Item item = value as Item;
        if (item == null) return null;

        return item.IsFile ? FileContextMenu : DirContextMenu;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ItemToContextMenuConverter.FileContextMenu 
            = this.Resources["FileContextMenu"] as ContextMenu;
        ItemToContextMenuConverter.DirContextMenu 
            = this.Resources["DirContextMenu"] as ContextMenu;

        List<Item> items = new List<Item>();
        items.Add(new Item() { Name = "First", IsFile = true });
        items.Add(new Item() { Name = "Second", IsFile = false });

        SomeList.ItemsSource = items;
    }
Run Code Online (Sandbox Code Playgroud)