Нет события ContextMenuChanging(ed) в WPF

У меня есть пользовательский Shape - MyShape - (может быть контроль, не важно).

У MyShape есть украшение - TextAdorner.

TextAdorner должен иметь тот же ContextMenu, что и MyShape (поскольку они представляют один и тот же уникальный объект).

CustomMenu MyShape изменяется в коде при некоторых условиях. Итак, мне нужно определить момент, когда MyShape меняет свое CustomMenu, чтобы также обновить контекстное меню декоратора.

Однако нет ни ContextMenuChanging, ни ContextMenuChanged событий.

Я использую этот код для первого назначения ContemxtMenu, однако, когда украшенный элемент меняет контекстное меню, я не знаю, как их синхронизировать.

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

Как мне поступить в этой ситуации?


person serhio    schedule 25.11.2010    source источник


Ответы (2)


Что вы хотите, так это создать одностороннюю привязку свойства ContextMenu из вашего объекта MyShape к вашему TextAdorner

so :

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

person Johan Buret    schedule 25.11.2010

Вместо того, чтобы просто назначать свойство 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
            });
    }

Вы также можете выполнить привязку, используя свойство AdornedElement в Adorner:

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

Этот подход будет работать, если вам нужно указать привязку в XAML:

<Something ContextMenu="{Binding AdornedElement.ContextMenu, 
    RelativeSource={RelativeSource Self}}"/>
person Quartermeister    schedule 25.11.2010
comment
Спасибо. Делает ли ваш код то же самое, что и предложенный Йоханом Буретом? - person serhio; 25.11.2010
comment
@serhio: Да, они должны делать то же самое. - person Quartermeister; 25.11.2010