У меня есть пользовательский холст (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>
вы можете показать больше кода? например: как вы устанавливаете контекстное меню? вы получаете какие-либо ошибки привязки в окне вывода? –
@redoced - Я добавил дополнительные сведения. Мне все еще нужно отлаживать привязки, сообщит вам, если я увижу. – akjoshi