来自 ViewModel 的 Datagrid 文本框中的自定义 ContextMenu 命令

Custom ContextMenu Command in Datagrid's Textbox from ViewModel

我有一个包含 Datagrid 的 UserControl。在 Datagrid 内部,我设置了带有文本框的 EditingElementStyle,这些文本框具有用于 Copy/Paste 命令的 ContextMenu。我需要为 Copy/Paste 实现自定义命令,最好从 ViewModel 执行命令。

这是我的带有数据网格的用户控件:

<UserControl x:Class="My_project.View.SearchEmployees"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:ctl="clr-namespace:My_project.Controls"
             x:Name="_search">
 <Grid>

   //... Other controls

   <ctl:My_dataGrid ItemsSource="{Binding Employees}">
      <DataGrid.Columns>
        <DataGridTextColumn Width="130" Header="Name" Binding="{Binding NAME}">
           <DataGridTextColumn.EditingElementStyle>
             <Style TargetType="TextBox" BasedOn="{StaticResource Txt_dgv}">
               <Setter Property="Tag" Value="{Binding DataContext, 
                       ElementName=_search}"/> <!--doesn't work-->
             </Style>
           </DataGridTextColumn.EditingElementStyle>
        </DataGridTextColumn>
      </DataGrid.Columns>
   </ctl:My_dataGrid>

 </Grid>
</UserControl>

我的带有上下文菜单的自定义文本框:

 <Style TargetType="{x:Type TextBox}" x:Key="Txt_dgv">
        <Setter Property="VerticalAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>

                        <Border BorderBrush="Silver" BorderThickness="0,0,0,1" 
                                Background="Transparent" SnapsToDevicePixels="True">
                            <ScrollViewer x:Name="PART_ContentHost" Focusable="False" 
                                          HorizontalScrollBarVisibility="Hidden"  
                                          VerticalAlignment="Center"
                                          VerticalScrollBarVisibility="Hidden" />
                        </Border>

                   </Grid>
 
              </ControlTemplate>
            </Setter.Value>
        </Setter>

        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu >
                     <MenuItem Command="{Binding Path=PlacementTarget.Tag.COPY_COMMAND, 
                               RelativeSource={RelativeSource AncestorType=ContextMenu}}" <!--doesn't work--> 
                               Header="Copy" />
                
                    <MenuItem Command="{Binding Path=PlacementTarget.Tag.PASTE_COMMAND, 
                              RelativeSource={RelativeSource AncestorType=ContextMenu}}" <!--doesn't work-->
                              Header="Paste" />
                                     
                </ContextMenu>
            </Setter.Value>

        </Setter>

    </Style>

在上面的示例中,我使用文本框标记 属性 来设置 UserControl 的 DataContext,然后将其设置为 ContextMenu 的 DataContext。

但输出什么都没有——甚至没有错误。我猜想这必须与 ContextMenu 不是 Visual Tree 的一部分,并且 Textbox 在其中太深这一事实有关。

有人对如何解决这个问题有更好的想法吗?

您不能使用 ElementName 属性 绑定到 _search,因为它属于不同的 XAML namescope

您可以使用 RelativeSource 属性 绑定到 UserControlDataContext

<Setter Property="Tag" Value="{Binding DataContext,
    RelativeSource={RelativeSource AncestorType=UserControl}}"/>