Почему я не могу использовать DataContext = {Binding} для моего контекстного меню? - PullRequest
3 голосов
/ 02 августа 2011

У меня есть код, который выглядит примерно так:

<HierarchicalDataTemplate
    DataType="{x:Type local:SomeType}"
    ItemsSource="{Binding SomeOtherItems}"
    >
    <DockPanel Margin="4">
        <DockPanel.ContextMenu>
            <local:SomeContextMenu DataContext="{Binding}" />
        </DockPanel.ContextMenu>
        <CheckBox IsChecked="{Binding SomeBooleanProperty, Mode=TwoWay}" />
        <TextBlock
            Margin="4,0"
            Text="{Binding Name}" />
    </DockPanel>
</HierarchicalDataTemplate>

Без контекстного меню все работает как положено. Но когда я добавлю эти строки:

<DockPanel.ContextMenu>
    <local:SomeContextMenu DataContext="{Binding}" />
</DockPanel.ContextMenu>

Я получаю эту ошибку (во время выполнения) для каждого элемента, который использует HierarchicalDataTemplate:

System.Windows.Data Ошибка: 3: не удается найти элемент, предоставляющий DataContext. BindingExpression: (без пути); DataItem = NULL; целевой элемент - SomeContextMenu (Name = ''); Свойство target - «DataContext» (тип «Object»)

Почему Binding работает для всего, кроме контекстного меню, но не для контекстного меню?

1 Ответ

17 голосов
/ 02 августа 2011

Прежде всего, DataContext="{Binding}" не имеет особого смысла, поскольку это связывает DataContext с DataContext.Проблема здесь, вероятно, в том, что ContextMenu не находится в логическом дереве, и его визуальное дерево отключено, поскольку ContextMenus являются плавающими всплывающими окнами.

Попробуйте связать DataContext через PlacementTarget:

 DataContext="{Binding PlacementTarget.DataContext,
                       RelativeSource={RelativeSource Self}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...