来自 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
属性 绑定到 UserControl
的 DataContext
:
<Setter Property="Tag" Value="{Binding DataContext,
RelativeSource={RelativeSource AncestorType=UserControl}}"/>
我有一个包含 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
属性 绑定到 UserControl
的 DataContext
:
<Setter Property="Tag" Value="{Binding DataContext,
RelativeSource={RelativeSource AncestorType=UserControl}}"/>