【问题标题】:Custom ContextMenu Command in Datagrid's Textbox from ViewModel来自 ViewModel 的 Datagrid 文本框中的自定义 ContextMenu 命令
【发布时间】:2022-01-06 14:11:23
【问题描述】:

我有一个包含 Datagrid 的 UserControl。在 Datagrid 中,我使用具有用于复制/粘贴命令的 ContextMenu 的文本框设置了 EditingElementStyle。我需要为复制/粘贴实现自定义命令,最好从 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>

我的带有 ContextMenu 的自定义文本框:

 <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>

在上面的示例中,我使用 Textbox Tag 属性来设置 UserControl 的 DataContext,然后将其设置为 ContextMenu 的 DataContext。

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

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

【问题讨论】:

  • EditingElementStyle 中没有可以绑定的元素_search
  • @mm8 - 为什么,EditingElementStyle 也不是 Visual Tree 的一部分?还有什么我可以尝试的吗?
  • 请看我的回答。

标签: c# wpf mvvm contextmenu


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,成功了!
猜你喜欢
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多