绑定上下文菜单项与依赖属性
我有一个自定义画布(DesignerCanvas),用户可以添加一些控制这个画布。在添加任何控件画布之前,首先包装一个自定义控件(Designer Item),然后将该控件添加到画布。绑定上下文菜单项与依赖属性
这样做是因为这CodeProject上的文章 -
WPF关系图设计 - http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part4.aspx
我已经加入上下文菜单都DesignerCanvas且命名为 '锁定' 的菜单项DesignerItem。我还在画布上添加了一个名为“IsLocked”的属性来锁定画布。
现在,在上下文菜单我想说明一个对勾,如果画布被锁定,要做到这一点我已绑定了IsLocked属性菜单项的“器isChecked”属性。问题在于它适用于DesignerCanvas的cantext菜单,但不适用于DesignerItems上下文菜单。
DesignerCanvas文本菜单代码,这工作得很好 -
<!-- Context menu for DesignerCanvas -->
<ContextMenu x:Key="DesignerCanvasContextMenu">
<!-- Other menu items -->
<MenuItem IsCheckable="True" Header="Lock"
IsChecked="{Binding Path=IsLocked, Mode=TwoWay,
RelativeSource={RelativeSource AncestorType={x:Type locl:DesignerCanvas}}}"
Command="{x:Static local:DesignerCanvas.LockUnLock}"
CommandParameter="{Binding RelativeSource={RelativeSource Self},
Path=IsChecked}"
CommandTarget="{Binding Path=PlacementTarget,
RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}">
</MenuItem>
</ContextMenu>
需要做的DesignerItem菜单achive相同的行为了。我想这样做,但它不工作 -
<!-- Context menu for DesignerItem -->
<ContextMenu x:Key="DesignerItemContextMenu">
<!-- Other menu items -->
<MenuItem IsCheckable="True" Header="Lock"
IsChecked="{Binding Path=Parent.IsLocked, Mode=TwoWay,
RelativeSource={RelativeSource AncestorType={x:Type locl:DesignerItem}}}"
Command="{x:Static local:DesignerCanvas.LockUnLock}"
CommandParameter="{Binding RelativeSource={RelativeSource Self},
Path=IsChecked}"
CommandTarget="{Binding Path=PlacementTarget,
RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}">
</MenuItem>
</ContextMenu>
我试图做到这一点使用PlacementTarget过,但没有成功。由于DesignerItem是DesignerCanvas的孩子,因此不应该不可能掌握DesignerCanvas,并转而获得其属性。我做错了什么,有什么想法?
更新:
我附上上下文菜单DesignerCanvas和设计项目这样的 -
<!-- DesignerItem || Style -->
<Style TargetType="{x:Type locl:DesignerItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:DesignerItem}">
<Grid x:Name="PART_Grid" Cursor="SizeAll"
DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}
,Path=.}"
ContextMenu="{StaticResource DesignerItemContextMenu}">
<!-- other template parts -->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- DesignerCanvas || Style -->
<Style
TargetType="{x:Type locl:DesignerCanvas}">
<Setter
Property="ContextMenu"
Value="{StaticResource DesignerCanvasContextMenu}" />
</Style>
只是一个快速的猜测:
你尝试过设置你的文本菜单上DesignerItem与帆布相同的方式?像这样:
<Style TargetType="{x:Type locl:DesignerItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:DesignerItem}">
<Grid x:Name="PART_Grid" Cursor="SizeAll"
DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}
,Path=.}">
<!-- other template parts -->
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter
Property="ContextMenu"
Value="{StaticResource DesignerItemContextMenu}" />
</Style>
其他
比,我真的建议你火了您的应用程序Snoop,并期待在您的上下文菜单绑定错误
谢谢重做,这就是我所缺少的。我错误地附加了上下文菜单。更正它并像这样使用它 - IsChecked =“{Binding Path = PlacementTarget.Parent.IsLocked,Mode = TwoWay, RelativeSource = {RelativeSource AncestorType = {x:Type ContextMenu}}}” – akjoshi 2010-07-19 10:50:11
可以显示更多的代码?例如:你如何设置contextmenu?你会在输出窗口中看到任何绑定错误吗? – 2010-07-15 23:06:13
@redoced - 我添加了更多细节。我仍然需要调试绑定,如果我看到任何信息,会让你知道。 – akjoshi 2010-07-16 08:50:05