2010-07-15 2 views
0

У меня есть пользовательский холст (DesignerCanvas), пользователь может добавить некоторые элементы управления к этому холсту. Перед добавлением любого холста управления сначала обертывает его insdie настраиваемый элемент управления (элемент конструктора), а затем добавляет этот элемент управления в холст.Связывание элемента контекстного меню с свойством зависимости

Это делается в этой Codeproject статье -

WPF Diagram Designer - http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part4.aspx

Я добавил контекстные меню для обоих DesignerCanvas и DesignerItem имеющий пункт меню под названием 'Lock'. Я также добавил свойство в холсте с именем «IsLocked», чтобы заблокировать холст.

Теперь в контекстном меню я хочу показать галочку, если холст заблокирован, для этого я привязал свойство IsLocked к свойству «IsChecked» в MenuItem. Проблема заключается в том, что он работает для меню Cantext DesignerCanvas, но не для контекстного меню 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> 

нужно сделать achive такое же поведение для меню 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 и, в свою очередь, его собственностью. Что я делаю неправильно, любая идея?

Update:

Я прилагаю контекстное меню с DesignerCanvas и Designer Пункт, как это -

<!-- 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

вы можете показать больше кода? например: как вы устанавливаете контекстное меню? вы получаете какие-либо ошибки привязки в окне вывода? –

+0

@redoced - Я добавил дополнительные сведения. Мне все еще нужно отлаживать привязки, сообщит вам, если я увижу. – akjoshi

ответ

1

просто быстро догадка:

вы пробовали настройки вашего Контекстное на 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

Спасибо, redoced, вот что мне не хватало. Я неправильно использовал контекстное меню. Исправлено и использовалось так: IsChecked = "{Binding Path = PlacementTarget.Parent.IsLocked, Mode = TwoWay, RelativeSource = {RelativeSource AncestorType = {x: Type ContextMenu}}}" – akjoshi