我有一个自定义形状 - 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;
}
我应该如何处理这种情况?
答案 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);
}
}