Как привязать ContextMenu, который имеет Command, к присоединенному свойству? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть внешний элемент управления с именем DockSite. При отображении ContextMenu из элемента управления DockSite вызывается обработчик события MenuOpening.

Я хотел добавить свой ContextMenu в ContextMenu по умолчанию при вызове события MenuOpening, и я создал присоединенное свойство, как показано ниже, чтобы расширить поведение DockSite.

    public static ContextMenu GetAddDocumentMenu(DependencyObject obj)
    {
        return (ContextMenu)obj.GetValue(AddDocumentMenuProperty);
    }

    public static void SetAddDocumentMenu(DependencyObject obj, ContextMenu value)
    {
        obj.SetValue(AddDocumentMenuProperty, value);
    }

    // Using a DependencyProperty as the backing store for AddDocumentMenu.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty AddDocumentMenuProperty =
        DependencyProperty.RegisterAttached("AddDocumentMenu", typeof(ContextMenu), typeof(DockSiteHook), new PropertyMetadata(new ContextMenu(), OnDocumentMenuChanged));

    private static void OnDocumentMenuChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var dockSite = (sender as DockSite);
        if (dockSite == null) return;

        ContextMenu on = (ContextMenu)e.NewValue;
        if (on is null) dockSite.MenuOpening -= DockSite_MenuOpening;
        else dockSite.MenuOpening += DockSite_MenuOpening;
    }

    private static void DockSite_MenuOpening(object sender, DockingMenuEventArgs e)
    {
        e.Menu.Items.Add(DockSiteHook.GetAddDocumentMenu(sender as DockSite));
    }

Я использовал приведенный выше код в своем главном окне, как показано ниже.

<docking:DockSite Grid.Row="1" x:Name="dockSite">

    <ap:DockSiteHook.AddDocumentMenu>
        <ContextMenu>
            <MenuItem Command="{Binding TestCommand}"/>
        </ContextMenu>
    </ap:DockSiteHook.AddDocumentMenu>

<docking:DockSite/>

Но Visual Studio выдает ошибку, как показано на рисунке ниже.

enter image description here

enter image description here

Сообщение об ошибке «Не удается связать значение по умолчанию для AddDocumentMenu с указанным c thread ".

Я хочу связать ContextMenu с указанным c присоединенным свойством.

Может кто-нибудь сказать мне, почему возникла ошибка выше? и как решить эту проблему?

Спасибо за чтение.

1 Ответ

2 голосов
/ 18 февраля 2020

Установите значение по умолчанию null (или default(ContextMenu)):

public static readonly DependencyProperty AddDocumentMenuProperty = 
    DependencyProperty.RegisterAttached("AddDocumentMenu", typeof(ContextMenu), 
        typeof(DockSiteHook), new PropertyMetadata(null, OnDocumentMenuChanged));
...