Как получить ссылку на элемент родительского списка в XAML?

<Window> <!-- DataContext="HomeViewModel" -->
    <ListBox ItemsSource="{Binding Discs}"> <!-- HomeViewModel.ObservableCollection<DiscViewModel> -->
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TreeView ItemsSource="{Binding Folders}"> <!-- DiscViewModel.IList<Folder> -->
                    <TreeView.ItemTemplate>
                        <DataTemplate>
                            <cc:TreeViewItemEx Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}, Path=DataContext.GetFilesCommand}"/>
                        </DataTemplate>
                    </TreeView.ItemTemplate>
                </TreeView>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

Я хочу выполнить GetFilesCommand (определено DiscViewModel), когда Folder будет расширен. Для этого я расширил TreeViewItem с Command как DependencyProperty и выполнил эту команду в OnExpanded (переопределено). Это работает, но Command имеет значение null. Причина указана в ошибке ниже:

Свойство «GetFilesCommand» не найдено в «объекте» «HomeViewModel» (HashCode=22799085)». BindingExpression:Path=DataContext.GetFilesCommand; DataItem='ListBox' (Имя=''); целевой элемент — 'TreeViewItemEx' (Name=''); целевое свойство — «Команда» (тип «ICommand»)

Я понимаю ошибку, но не знаю, как исправить этот XAML, чтобы он выбирал команду из DiscViewModel, связанную с текущим элементом списка?


person Nikhil Vartak    schedule 15.07.2018    source источник


Ответы (1)


Ах, мой плохой! Мне нужен миндаль, кажется.

Измененный

AncestorType={x:Type ListBox}}

To

AncestorType={x:Type ListBoxItem}}

С прежним кодом он подхватывал DataContext ListBox и поэтому жаловался на команду, не найденную в HomeViewModel, которая является DataContext для ListBox.

Решил не удалять вопрос, потому что я уверен, что кто-то может наткнуться на подобную проблему в будущем.

person Nikhil Vartak    schedule 15.07.2018