簡體   English   中英

將ContextMenu命令綁定到父視圖模型RelayCommand

[英]Bind ContextMenu Command to parents viewmodel RelayCommand

我有一個TvShowsViewModel (1),其中包含一個ObservableCollectionTvShowViewModel (2)。 TvShowViewModel包含ObservableCollectionSeasonViewModel S(3)。

我有一個TreeView ,它具有TvShowsViewModel (1)作為DataContext TreeViewItemSource綁定到TvShowViewModelsObservableCollection (2)。

TreeView指定一個HierarchicalDataTemplate ,該SeasonViewModels綁定到SeasonViewModelsObservableCollection (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
    }
}

TvShowViewModel(2)

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

    // Left out irrelevant code
}

SeasonViewModel(3)

public class SeasonViewModel : ViewModelBase, IFolderOnDisk
{
    // Left out irrelevant code
}

剝離的用戶控件(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>

綁定,我不知道

最后,經過許多Google搜索之后,我遇到了解決方案

<MenuItem
    Header="Exclude season"
    Command="{Binding DataContext.ExcludeSeasonCommand, Source={x:Reference _tvShowsTreeView}}" />

因為HierarchicalDataTemplate沒有出現在視覺樹中,所以沒有“相對”源...

我希望這對其他正在拔頭發的人有所幫助...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM