C# 为什么ContextMenu命令和CommandParameter在DataGrid中不起作用
我有一个C# 为什么ContextMenu命令和CommandParameter在DataGrid中不起作用,c#,wpf,mvvm,binding,datagrid,C#,Wpf,Mvvm,Binding,Datagrid,我有一个DataGird,然后是includeExpander和ContextMenu 此DataGird正在分组。而且,它在Expander和DataGridItem之间具有不同的ContextMenu 但是,我想将MenuItem命令绑定到我的命令,并将DataGird的SelectedItems或SelectedIndex传递到命令 但是这个命令没有被调用。即使它能工作,当我调查某个方法是否达到目标(如set propertytag)时,该参数也不能通过 所以,我想知道什么是正确的方法 概
DataGird
,然后是includeExpander
和ContextMenu
此DataGird
正在分组。而且,它在Expander
和DataGridItem
之间具有不同的ContextMenu
但是,我想将MenuItem
命令
绑定到我的命令,并将DataGird
的SelectedItems
或SelectedIndex
传递到命令
但是这个命令没有被调用。即使它能工作,当我调查某个方法是否达到目标(如set propertytag
)时,该参数也不能通过
所以,我想知道什么是正确的方法
概述
<UserControl.DataContext>
<vm:ViewModel x:Name="VM"/>
</UserControl.DataContext>
<Grid>
<DataGrid x:Name="dg"
ItemsSource="{Binding SourceData}"
AutoGenerateColumns="False"
CanUserResizeColumns="False"
CanUserResizeRows="False"
CanUserAddRows="False"
CanUserSortColumns="False"
SelectionMode="Extended"
RowHeaderWidth="0"
GridLinesVisibility="Horizontal">
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="BorderThickness" Value="0"/>
<!-- Remove the focus indication for the selected cell -->
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
</Style>
</DataGrid.CellStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="No." Binding="{Binding No}" />
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
</DataGrid.Columns>
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander IsExpanded="False" MouseRightButtonDown="Expander_MouseRightButtonDown" ButtonBase.Click="Expander_Click">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="Insert" InputGestureText="Ctrl+I" Command="{Binding InsertGroupItems"/>
<MenuItem Header="Remove" InputGestureText="Ctrl+D" Command="{Binding RemoveGroupItems"/>
</ContextMenu>
</StackPanel.ContextMenu>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding ItemCount}"/>
<TextBlock Text=" item(s)"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter>
<ItemsPresenter.ContextMenu>
<ContextMenu>
<ContextMenu>
<MenuItem Header="Insert" InputGestureText="Ctrl+I" Command="{Binding InsertSelectedItems" CommandParameter="{Binding ElementName=dg, Path=SelectedIndex}"/>
<MenuItem Header="Remove" InputGestureText="Ctrl+D" Command="{Binding RemoveSelectedItems" CommandParameter="{Binding ElementName=dg, Path=SelectedItems}"/>
</ContextMenu>
</ItemsPresenter.ContextMenu>
</ItemsPresenter>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
</DataGrid>
</Grid>
所以,也许我有三个问题
上下文菜单
不工作CommandParameter
未通过SelectedItems
转换为列表谢谢在
上下文菜单中的菜单项
不能使用元素名
绑定到数据网格
,因为上下文菜单
和数据网格
属于不同的元素树
您可以做的是将项resenter
的标记
属性绑定到数据网格
,然后通过上下文菜单的放置目标
绑定到数据网格
的属性:
<ItemsPresenter Tag="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}}">
<ItemsPresenter.ContextMenu>
<ContextMenu>
<MenuItem Header="Insert2" InputGestureText="Ctrl+I"
DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
Command="{Binding DataContext.InsertSelectedItems}"
CommandParameter="{Binding SelectedIndex}"/>
<MenuItem Header="Remove2" InputGestureText="Ctrl+D"
DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
Command="{Binding DataContext.RemoveSelectedItems}"
CommandParameter="{Binding SelectedItems}"/>
</ContextMenu>
</ItemsPresenter.ContextMenu>
</ItemsPresenter>
编辑:
当然,绑定到CommandArgument
时也不能使用ElementName
。试试这个:
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Tag" Value="{Binding Path=., RelativeSource={RelativeSource AncestorType=DataGrid}}" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Insert" InputGestureText="Ctrl+I"
Command="{Binding PlacementTarget.Tag.DataContext.InsertSelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.Tag.SelectedIndex, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
<MenuItem Header="Remove" InputGestureText="Ctrl+D"
Command="{Binding PlacementTarget.Tag.DataContext.RemoveSelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.Tag.SelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>
</Setter.Value>
</Setter>
上下文菜单中的菜单项
不能使用元素名
绑定到数据网格
,因为上下文菜单
和数据网格
属于不同的元素树
您可以做的是将项resenter
的标记
属性绑定到数据网格
,然后通过上下文菜单的放置目标
绑定到数据网格
的属性:
<ItemsPresenter Tag="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}}">
<ItemsPresenter.ContextMenu>
<ContextMenu>
<MenuItem Header="Insert2" InputGestureText="Ctrl+I"
DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
Command="{Binding DataContext.InsertSelectedItems}"
CommandParameter="{Binding SelectedIndex}"/>
<MenuItem Header="Remove2" InputGestureText="Ctrl+D"
DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
Command="{Binding DataContext.RemoveSelectedItems}"
CommandParameter="{Binding SelectedItems}"/>
</ContextMenu>
</ItemsPresenter.ContextMenu>
</ItemsPresenter>
编辑:
当然,绑定到CommandArgument
时也不能使用ElementName
。试试这个:
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Tag" Value="{Binding Path=., RelativeSource={RelativeSource AncestorType=DataGrid}}" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Insert" InputGestureText="Ctrl+I"
Command="{Binding PlacementTarget.Tag.DataContext.InsertSelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.Tag.SelectedIndex, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
<MenuItem Header="Remove" InputGestureText="Ctrl+D"
Command="{Binding PlacementTarget.Tag.DataContext.RemoveSelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.Tag.SelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>
</Setter.Value>
</Setter>
谢谢您的回答。如果我在
中按样式定义标记和上下文菜单
,我尝试您的代码不起作用。这是令人困惑的。我会更新我的代码。它肯定对我有用。我不知道“这是混乱”是什么意思。对不起,我不明白你的意思。也许你应该再读一遍我的答案。当然,绑定到CommandArgument时也不能使用ElementName。哦。。也许你能看到我的更新代码。我将再次尝试使用空项目。谢谢您的回答。如果我在
中按样式定义标记和上下文菜单
,我尝试您的代码不起作用。这是令人困惑的。我会更新我的代码。它肯定对我有用。我不知道“这是混乱”是什么意思。对不起,我不明白你的意思。也许你应该再读一遍我的答案。当然,绑定到CommandArgument时也不能使用ElementName。哦。。也许你能看到我的更新代码。我将再次尝试使用空项目。
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Tag" Value="{Binding Path=., RelativeSource={RelativeSource AncestorType=DataGrid}}" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Insert" InputGestureText="Ctrl+I"
Command="{Binding PlacementTarget.Tag.DataContext.InsertSelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.Tag.SelectedIndex, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
<MenuItem Header="Remove" InputGestureText="Ctrl+D"
Command="{Binding PlacementTarget.Tag.DataContext.RemoveSelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding PlacementTarget.Tag.SelectedItems, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</ContextMenu>
</Setter.Value>
</Setter>