2017-01-24 8 views
0

Цель: Щелкните правой кнопкой мыши на ListBox и получите связанный контекстMenu.Trouble With ContextMenu, не отображающий элементы

public class MyViewModel 
{ 

    public List<string> ContextMenuItems{ get; set; } 
    public ItemObject MyObject{ get; set; } 
} 

public class ItemObject{ 
    public List<OtherObjects> SomeCollection{ get; set; } 
} 

Теперь мой ListBox будет привязываться к "SomeCollection", но мой ContextMenu должен получить доступ к Binding вне ListBox, обязательными. Я попытался и не могу заставить его работать вообще, мое контекстное меню всегда пустое. Любая идея почему? Это в UserControl, а не в Window, а не в том, что это релевантно. Я просто показываю, почему мои пункты AncestorType в UserControl

<ListBox ItemsSource="{Binding SomeCollection}"> 
<ListBox.ContextMenu > 
<ContextMenu DataContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" ItemsSource="{Binding ContextMenuItems}"> 
    <ContextMenu.ItemTemplate> 
     <DataTemplate> 
      <MenuItem Header="{Binding}" Command="{Binding MyCommand}"/> 
     </DataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 
</ListBox.ContextMenu> 
</ListBox> 
+0

Какая ошибка привязки? (он появляется в окне «Выход»). Мне всегда нужно время, чтобы контекстные меню правильно связывались ... – Joe

+0

Посмотрите на свой ItemsSource, который связан с ContextMenuItems, и это список строк. Связывание заголовков выглядит правильно для меня и привязывается к элементу, но что такое MyCommand? Я не думаю, что свойство отсутствует в строке. –

+0

@Joe System.Windows.Data Error: 4: Не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType =' System.Windows.Controls.UserControl ', AncestorLevel =' 1 ''. BindingExpression: Path = DataContext.StandardLinksContextMenu; DataItem = NULL; целевой элемент - «ContextMenu» (Name = ''); target свойство - «ItemsSource» (тип «IEnumerable») – user1702369

ответ

1

Контекстные меню, как известно, сложно связать с в WPF. Причина этого заключается в том, что они существуют вне визуального дерева, что и остальные компоненты. (Если вы думаете об этом, это имеет смысл, поскольку они находятся в своем всплывающем окне).

Поскольку они находятся в другом визуальном дереве, полезные вещи, такие как возможность привязки по имени, вызывают ошибки привязки, как вы обнаружили. «Невозможно найти источник» означает, что он не может найти именованный элемент в визуальном дереве.

Один из способов обойти это - использовать свойство PlacementTarget самого контекстного меню. Это относится к родительскому контролю, в котором вы можете получить доступ к контексту данных, как это:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" ItemsSource="{Binding ContextMenuItems}"> 

Я также считаю, если я делаю что-то действительно сложным и нужно сослаться на несколько вещей в большом контекстном меню мне нравится эффективно хранить вещи, которые я хочу получить в прокси-статических ресурсах.

Создать собственный класс прокси:

public class BindingProxy : Freezable 
{ 
    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

В своих ресурсах, создать прокси-объект всякий раз, когда у вас есть трудности с доступом правильного DataContext:

<UserControl.Resources> 
    <local:BindingProxy x:Key="Proxy" Data="{Binding}" /> 
</UserControl.Resources> 

Тогда в любом месте XAML вы можете получить доступ к нему очень легко:

<ContextMenu ItemsSource="{Binding Data.ContextMenuItems, Source={StaticResource Proxy}}"> 
+0

Я только что основал это и внедрил его, спасибо в любом случае. Большое решение, спасибо большое – user1702369

 Смежные вопросы

  • Нет связанных вопросов^_^