代码之家  ›  专栏  ›  技术社区  ›  akjoshi HCP

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

  •  0
  • akjoshi HCP  · 技术社区  · 16 年前

    我有一个自定义画布(DesignerCanvas),用户可以添加一些控件到这个画布。在添加任何控件之前,画布首先将其包装到自定义控件(设计器项)中,然后将该控件添加到画布中。

    WPF图设计器- http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part4.aspx

    我为DesignerCanvas和DesignerItem添加了上下文菜单,它们都有一个名为“Lock”的菜单项。我还在canvas中添加了一个名为“IsLocked”的属性来锁定画布。

    现在,在上下文菜单中,如果canvas被锁定,我想显示一个复选标记,为此,我将IsLocked属性绑定到MenuItem的IsChecked属性。问题是它适用于DesignerCanvas cantext菜单,但不适用于DesignerItems上下文菜单。

    DesignerCanvas ContextMenu代码,这个很好用-

    <!-- 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菜单执行相同的行为。我试过这么做,但没用-

    <!-- 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及其财产应该不是不可能的。我做错什么了,知道吗?

    更新:

    我附上与设计师的画布和设计师这样的项目上下文菜单-

    <!-- 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>
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Markus Hütter    16 年前

    只是一个简单的猜测:

    您是否尝试过将DesignerItem的Contextmenu设置为与画布相同的方式?像这样:

    <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