Привязка контекстного меню

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

  <ItemsControl ItemsSource="{Binding ViewModelOne.Items}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="Canvas.Left" Value="{Binding X}"/>
                <Setter Property="Canvas.Top" Value="{Binding Y}"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
        <ItemsControl.ItemTemplate>
            <DataTemplate >
                <ContentControl>
                      <StackPanel Orientation="Vertical">
                             <StackPanel.ContextMenu>
                                <ContextMenu >
                                <MenuItem Header="Delete" Command="{Binding ViewModelOne.DeleteCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:MainWindow}}}" />
                                </ContextMenu>
                            </StackPanel.ContextMenu>
                            <TextBlock x:Name="Details" Text="{Binding Details}" />
                            <TextBlock x:Name="Name" Text="{Binding Name}" />
                            <Rectangle x:Name="Rects" Height="10" Width="10" Stroke="Black" StrokeThickness="1" />
                        </StackPanel>
                </ContentControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
  

У меня есть приведенная выше часть кода в моем проекте, и я пытаюсь связать команду Contextmenu, как правильно.

Я также пытался

  <MenuItem Header="Delete" Command="{Binding PlacementTarget.Tag.DeleteCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ContextMenu}}"  />
  

Тем не менее я не смог заставить команду работать

Комментарии:

1. Можете ли вы показать объявление класса в ViewModelOne. Элементы?

2. @Daniel Точно, есть ли обходной или другой способ решить эту проблему?

Ответ №1:

Вместо того, чтобы помещать ContextMenu на вашу панель стека, установите ContextMenu для вашего элемента в ItemContainerStyle , а также установите Tag для элемента родительский DataContext.

  <ItemsControl x:Name="MyItemControl" ItemsSource="{Binding ViewModelOne.Items}">
     <ItemsControl.ItemContainerStyle>
                <Style TargetType="ContentPresenter">
                    <Setter Property="Tag" Value="{Binding DataContext, ElementName=MyItemControl}"></Setter>
                    <Setter Property="ContextMenu">
                        <Setter.Value>
                            <ContextMenu >
                                <MenuItem Header="Delete" Command="{Binding PlacementTarget.Tag.ViewModelOne.DeleteCommand, RelativeSource={RelativeSource Self}}" />
                            </ContextMenu>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Canvas.Left" Value="{Binding X}"/>
                    <Setter Property="Canvas.Top" Value="{Binding Y}"/>
                </Style>
            </ItemsControl.ItemContainerStyle>
  

Комментарии:

1. можете ли вы проверить наличие каких-либо ошибок привязки в окне вывода при запуске контекстного меню и щелчке по нему

2. небольшое изменение к тому, что вы указали выше, сработало. ИмяэлемЕнта=window и вместо RelativeSource={RelativeSource Self} к RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}