文本菜单上的TreeView,元素MVVM风格(ContextMenu on TreeView-El

2019-10-20 02:50发布

我有“简单”的任务有一个文本菜单上一个TreeView(元素)在MVVM-方式进行。 当在网上搜索,我发现了一些解决方案,我可以把与按钮等,但不与TreeView的工作。 我认为这个问题是与设定的树视图的ItemsSource属性,它使每一个项目一个自己的DataContext。

这是我的小测试,应用,在那里你可以看到原理工作按钮,而不是TreeView的元素:

MainWindow.xaml:

<Window x:Class="ContextMenu.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Grid >
        <StackPanel>
            <TextBlock Text="{Binding MyText}" />

            <Button Tag="{Binding DataContext,RelativeSource={RelativeSource Mode=Self}}" Content="Click me">
                <Button.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="{Binding PlacementTarget.Tag.MyText,
                            RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}" />
                    </ContextMenu>
                </Button.ContextMenu>
            </Button>

            <TreeView ItemsSource="{Binding MyList}" Tag="{Binding DataContext, RelativeSource={RelativeSource Mode=Self}}">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate>
                        <TextBlock Text="{Binding Name}">
                            <TextBlock.ContextMenu>
                                <ContextMenu>
                                    <MenuItem Header="{Binding Path=PlacementTarget.Tag.MyText, 
                                        RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" />
                                </ContextMenu>
                            </TextBlock.ContextMenu>
                        </TextBlock>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>         
            </TreeView>

        </StackPanel>        
    </Grid>
</Window>

代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowVM();
    }
}

MainWindowVM.cs:

public class MainWindowVM
{
    public string MyText { get; set; }
    public ObservableCollection<TreeElement> MyList { get; set; }

    public MainWindowVM()
    {
        MyText = "This is my Text!";
        MyList = new ObservableCollection<TreeElement>();
        MyList.Add(new TreeElement("String 1"));
        MyList.Add(new TreeElement("String 2"));
    }
}

public class TreeElement
{
    public string Name { get; set; }
    public TreeElement(string Name)
    {
        this.Name = Name;
    }
}

谢谢你的帮助!! 约尔格

Answer 1:

你靠近。

你在做什么:

  1. 您设置的TagTreeView它自己DataContext 。 这是不必要的。
  2. 你试图让Tag.MyTextContextMenu.PlacementTarget -这是TextBlock 。 该TextBlockTag集。

你应该做的:

  1. 在设置TagTextBlockDataContext的窗口(窗口是TextBlock祖先,你应该看看它通过RelativeSource Mode=FindAncestor )。
  2. 第二部分是好的-你有TextBlock.Tag在第一步中设置。


文章来源: ContextMenu on TreeView-Element in MVVM-style