Нет события ContextMenuChanging (ed) в WPF - PullRequest
0 голосов
/ 25 ноября 2010

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

MyShape имеет украшателя - TextAdorner.

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 25 ноября 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}}"/>
1 голос
/ 25 ноября 2010

Вам нужно создать одностороннюю привязку для свойства 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...