Jwls Ответов: 1

В WPF, как привязать к командам в модель представления предка


Мой английский плох, так что я не знаю, смогу ли я объяснить это ясно, извините за это.
И я действительно не знаю, как это объяснить, когда пытаюсь провести какое-то исследование.

В настоящее время у меня есть страница, которая является UserConstrol называется "ToolPathPage", и он содержит другой элемент управления UserControl называется "ToolPathDataControl", который не содержит ничего, кроме элементе управления DataGrid.

Теперь я хочу привязать команду в ToolPathPageViewModel к элементу меню в ToolPathDataControl.xaml.

Что я уже пробовал:

<DataGrid.ContextMenu>
    <ContextMenu >
        <MenuItem Header="Clear" Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:ToolPathPage},AncestorLevel= 1}, Path=DataContext.(viewModel:ToolPathPageViewModel.Clear_AllCommand)}"/>
    </ContextMenu>
</DataGrid.ContextMenu>

В окне вывода он говорит::
Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='mTracker.ToolPathPage', AncestorLevel='1''. BindingExpression:Path=DataContext.(0); DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand')

Graeme_Grant

"BindingExpression:Path=DataContext.(0); DataItem=null;" - не удается найти искомый DataContext...

Jwls

Спасибо за ответ, но я действительно установил DataContext страницы Toolpath в ToolPathPageViewModel.
И означает ли это, что страница ToolPathPage успешно найдена в качестве предка?

Graeme_Grant

Вы можете использовать инспектор XAML в VS2017 для проверки ;)

Richard Deeming

Контекстное меню не является частью визуального дерева, поэтому привязка "найти предка" не будет работать.

Возможно, вы сможете найти обходной путь, основанный на этой статье:
WPF: ContextMenu снова наносит удар. DataContext Не Обновляется[^]

Jwls

Это работает, большое спасибо!

1 Ответов

Рейтинг:
6

Jwls

Благодаря @RichardDeeming Я получил свое окончательное решение.:

<DataGrid Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:ToolPathPage}},Path=DataContext.(viewModel:ToolPathPageViewModel.Clear_AllCommand)}">
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Clear" Command="{Binding PlacementTarget.Tag,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}"/>
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>


awsnap

Да, да, да. Это единственный ответ, который я смог найти, который относился к MVVM и касался визуального разделения дерева ContextMenu.

В моем случае DataGrid на самом деле был StackPanel. Я просто использовал свойство DataContext.Командование.