将ContextMenu命令绑定到父视图模型RelayCommand

bas*_*bas 1 c# data-binding wpf treeview parent

我有一个TvShowsViewModel(1)包含一个ObservableCollectionTvShowViewModelS(2).甲TvShowViewModel含有ObservableCollectionSeasonViewModelS(3).

我有一个TreeView,它有TvShowsViewModel(1)as DataContext.所述ItemSource的该TreeView结合所述ObservableCollectionTvShowViewModels(2).

TreeView指定一个HierarchicalDataTemplate,其结合ObservableCollectionSeasonViewModels(3).

HierarchicalDataTemplate包含ContextMenu.

现在,ContextMenu包含了Command我想要绑定到RelayCommandTvShowsViewModel(1).

我尝试了各种RelativeSource绑定,但没有任何导致解决方案.我该如何指定绑定?

TvShowsViewModel(1)

public class TvShowsViewModel : ViewModelBase
{
    public RelayCommand ExcludeSeasonCommand { get; private set; }

    public ObservableCollection<TvShowViewModel> TvShows { get; private set; }

    public TvShowsViewModel(ITvShowsLibrary tvShowsLibrary)
    {
        TvShows = new ObservableCollection<TvShowViewModel>();

        ExcludeSeasonCommand = new RelayCommand(ExcludeSeasonCommandOnExecute, ExcludeSeasonCommandOnCanExecute);

    // Left out irrelevant code
    }
}
Run Code Online (Sandbox Code Playgroud)

TvShowViewModel(2)

public class TvShowViewModel : ViewModelBase, IFolderOnDisk
{
    public ObservableCollection<SeasonViewModel> Seasons
    {
        get { return _seasons; }
    }

    // Left out irrelevant code
}
Run Code Online (Sandbox Code Playgroud)

SeasonViewModel(3)

public class SeasonViewModel : ViewModelBase, IFolderOnDisk
{
    // Left out irrelevant code
}
Run Code Online (Sandbox Code Playgroud)

剥离的用户控件(TreeView)

<!-- Again, left out a lot of irrelevant parts -->
<TreeView ItemsSource="{Binding TvShows}">

    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate DataType="tvShows:TvShowViewModel" ItemsSource="{Binding Seasons}">
            <TextBlock Text="{Binding Name}" />

            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate>
                    <TextBlock Text="{Binding Name}">
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem
                                    Header="Exclude season"
                     <!-- This is where I need your help, how should I configure the binding? -->
                                    Command="{Binding Path=DataContext.ExcludeSeasonCommand, RelativeSource={RelativeSource AncestorType=TreeView}}" />
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
Run Code Online (Sandbox Code Playgroud)

绑定,我无法弄清楚

bas*_*bas 6

最后,经过许多谷歌搜索,我遇到了解决方案

<MenuItem
    Header="Exclude season"
    Command="{Binding DataContext.ExcludeSeasonCommand, Source={x:Reference _tvShowsTreeView}}" />
Run Code Online (Sandbox Code Playgroud)

因为HierarchicalDataTemplate没有出现在可视化树中,所以没有"相对"源...

我希望这可以帮助其他人拉扯他/她的头发......

  • 谢谢!保存了一些我的头发!请注意,您需要为TreeView指定一个名称以用作x:Reference. (2认同)