绑定上下文菜单项与依赖属性

问题描述:

我有一个自定义画布(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> 
+0

可以显示更多的代码?例如:你如何设置contextmenu?你会在输出窗口中看到任何绑定错误吗? – 2010-07-15 23:06:13

+0

@redoced - 我添加了更多细节。我仍然需要调试绑定,如果我看到任何信息,会让你知道。 – akjoshi 2010-07-16 08:50:05

只是一个快速的猜测:

你尝试过设置你的文本菜单上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,并期待在您的上下文菜单绑定错误

+0

谢谢重做,这就是我所缺少的。我错误地附加了上下文菜单。更正它并像这样使用它 - IsChecked =“{Binding Path = PlacementTarget.Parent.IsLocked,Mode = TwoWay, RelativeSource = {RelativeSource AncestorType = {x:Type ContextMenu}}}” – akjoshi 2010-07-19 10:50:11