У меня есть стиль, который, похоже, не работает. Несмотря на то, что Snoop сказал мне, что DataContext
для ListBoxItem
верен, ничего не появляется. Если это была проблема с привязкой для Commands
, я бы ожидал увидеть пустое контекстное меню.Как создать динамическое контекстное меню для ListBoxItems?
Стиль:
<ContextMenu x:Key="CommandsContextMenu" ItemsSource="{Binding Commands}">
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Name}"/>
</Style>
</ContextMenu>
<Style TargetType="ListBoxItem">
<Setter Property="ContextMenu" Value="{StaticResource CommandsContextMenu}" />
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<Binding Path="DataContext.HasCommands" />
</DataTrigger.Binding>
</DataTrigger>
</Style.Triggers>
</Style>
подглядывать DataContext:
Свойства Snoop показывает свойство ContextMenu даже не установлен.
Идея здесь в том, что, не зная, какой-либо из типов, я мог бы иметь стиль элемента ListBox, где, если вещь он был связан с имеет свойство, называемое HasCommands, и она была установлена истина, то он установил контекстное меню этого элемента списка, привязанного к свойству Commands.
Я не получаю никаких обязывающих ошибки или предупреждения от PresentationTraceSources.DataBindingSource
Почему не контекстное меню получить набор?
Ой, подождите - Извините, я просто просмотрел ваш вопрос. Я думаю, что единственная проблема, с которой вы можете столкнуться, - это просто, когда определяется стиль элемента меню. Это в содержании, где он будет проигнорирован. Попробуйте поместить его в ' ...' –
Контекстные меню не связаны с визуальным деревом их «родительского». Это означает, что они не наследуют «DataContext». См. Этот вопрос для нескольких способов обойти его. https://stackoverflow.com/questions/15033522/wpf-contextmenu-woes-how-do-i-set-the-datacontext-of-the-contextmenu –
Одна из потенциальных проблем, которые я вижу здесь, заключается в том, что ваш 'ContextMenu' является определяемый как ресурс. По умолчанию создается только один экземпляр, который затем возвращается при каждом извлечении из словаря, в результате чего этот единственный экземпляр устанавливается как контекстное меню нескольких элементов, что, я думаю, может быть причиной ваших проблем. Попробуйте установить на нем 'x: Shared =" False "', чтобы обеспечить создание нового экземпляра каждый раз, когда ресурс извлекается из словаря. Кроме того, комментарий @BradleyUffner полезен, и, вероятно, это будет следующая проблема, с которой вы столкнетесь. – Grx70