如何将具有Command的ContextMenu绑定到附加属性?

问题描述 投票:-1回答:1

我有一个名为DockSite的外部控件。从DockSite控件显示ContextMenu时,将调用MenuOpening事件处理程序。

[我想在调用MenuOpening事件时将ContextMenu添加到默认的ContextMenu,并且我如下创建了附加属性以扩展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));
    }

我在下面的MainWindow中使用了上面的代码。

<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的默认值绑定到特定线程”。

我想将ContextMenu绑定到特定的附加属性。

有人可以告诉我为什么触发上述错误吗?以及如何解决这个问题?

感谢阅读。

wpf contextmenu attached-properties
1个回答
0
投票

将默认值设置为null(或default(ContextMenu)):

public static readonly DependencyProperty AddDocumentMenuProperty = 
    DependencyProperty.RegisterAttached("AddDocumentMenu", typeof(ContextMenu), 
        typeof(DockSiteHook), new PropertyMetadata(null, OnDocumentMenuChanged));
© www.soinside.com 2019 - 2024. All rights reserved.