Связывание элемента контекстного меню со свойством зависимости - PullRequest
0 голосов
/ 15 июля 2010

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

Это делается так, как в этой статье проекта кода -

Диаграмма WPFDesigner - http://www.codeproject.com/KB/WPF/WPFDiagramDesigner_Part4.aspx

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

Теперь в контекстном меню я хочу показать галочку, если холст заблокирован, для этого я привязал свойство IsLocked.в свойство IsChecked объекта MenuItem.Проблема в том, что он работает для контекстного меню DesignerCanvas, но не для контекстного меню DesignerItems.

Код ContextMenu 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,Я пытался сделать это, но это не работает -

<!-- 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 и Designer Item следующим образом -

<!-- 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 Ответ

1 голос
/ 16 июля 2010

просто быстрое предположение:

Вы пробовали установить контекстное меню в DesignerItem таким же образом, как и для Canvas?вот так:

<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 в вашем приложении и искать ошибки привязки в вашем контекстном меню

...