2010-11-25 8 views
0

J'ai une forme personnalisée - MyShape - (peut être le contrôle, n'a pas d'importance).Non ContextMenuChanging (ed) événement dans WPF

MyShape a un adorer - TextAdorner. Le TextAdorner doit avoir le même ContextMenu comme MyShape (car ils représentent le même objet unique).

Le CustomMenu de MyShape est modifié dans le code dans certaines conditions. Donc, j'ai besoin de détecter le moment où MyShape change son CustomMenu pour mettre à jour l'adorner ContextMenu aussi.

Cependant, il n'y a pas ContextMenuChanging, ni ContextMenuChanged événements.

J'utilise ce code pour la première affectation de ContemxtMenu, cependant lorsque l'élément décoré change de menu contextuel, je ne sais pas comment les synchroniser.

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

Comment dois-je procéder dans cette situation?

Répondre

1

Ce que vous voulez est de créer un sens unique liant la propriété ContextMenu de votre objet MyShape à votre TextAdorner

donc:

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); 
    } 
} 

Référence: http://msdn.microsoft.com/en-us/library/ms742863.aspx

2

Au lieu d'affectation la propriété ContextMenu, créez une liaison. De cette façon, le framework gérera les mises à jour pour vous. Vous pouvez créer un liant avec le paramètre adornedElement comme source comme ceci:

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

Vous pouvez lier également d'utiliser la propriété AdornedElement sur le Adorner:

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

Cette approche ne fonctionnera que si vous devez spécifier la liaison en XAML:

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

merci. Votre code fait-il la même chose que celui proposé par Johan Buret? – serhio

+0

@serhio: Oui, ils devraient faire exactement la même chose. – Quartermeister

Questions connexes