У меня есть 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>