WPF中没有ContextMenuChanging(ed)事件

时间:2010-11-25 13:00:58

标签: .net wpf wpf-controls adorner

我有一个自定义形状 - MyShape - (可能是控制,无所谓)。

MyShape有一个装饰师 - TextAdorner

TextAdorner应与MyShape具有相同的ContextMenu(因为它们代表相同的唯一对象)。

MyShape的CustomMenu在某些情况下会在代码中更改。 因此,我需要检测MyShape更改其CustomMenu以更新装配器ContextMenu的时刻。

但是,没有ContextMenuChanging,也没有ContextMenuChanged个事件。

我将此代码用于第一个ContemxtMenu赋值,但是当装饰元素更改上下文菜单时,我不知道如何同步它们。

public class TextAdorner : Adorner
{
    public TextAdorner(UIElement adornedElement)
        : base(adornedElement)
    {
        this.ContextMenu = (adornedElement as MyShape).ContextMenu;
    }

我应该如何处理这种情况?

2 个答案:

答案 0 :(得分:2)

不是仅仅分配ContextMenu属性,而是创建一个Binding。这样,框架将为您处理更新。您可以使用adornedElement参数创建绑定作为源:

public class TextAdorner : Adorner
{
    public TextAdorner(UIElement adornedElement)
        : base(adornedElement)
    {
        BindingOperations.SetBinding(
            this,
            FrameworkElement.ContextMenuProperty,
            new Binding
            {
                Path = new PropertyPath(FrameworkElement.ContextMenuProperty),
                Source = adornedElement
            });
    }

您还可以使用Adorner上的AdornedElement属性进行绑定:

BindingOperations.SetBinding(
    this,
    FrameworkElement.ContextMenuProperty,
    new Binding("AdornedElement.ContextMenu")
    {
        RelativeSource = RelativeSource.Self
    });

如果您需要在XAML中指定绑定,则此方法将起作用:

<Something ContextMenu="{Binding AdornedElement.ContextMenu, 
    RelativeSource={RelativeSource Self}}"/>

答案 1 :(得分:1)

您想要的是在您的ContextMenu对象到MyShape

TextAdorner属性上创建单向绑定

所以:

public class TextAdorner : Adorner
{
    public TextAdorner(UIElement adornedElement)
        : base(adornedElement)
    {
        Binding myBinding = new Binding("ContextMenu");
        myBinding.Source = (adornedElement as MyShape);
        this.SetBinding(FrameworkElement.ContextMenuProperty,myBinding);
    }
}

参考:http://msdn.microsoft.com/en-us/library/ms742863.aspx