Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ContextMenu命令和CommandParameter在DataGrid中不起作用_C#_Wpf_Mvvm_Binding_Datagrid - Fatal编程技术网

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
,然后是include
Expander
ContextMenu

DataGird
正在分组。而且,它在
Expander
DataGridItem
之间具有不同的
ContextMenu

但是,我想将
MenuItem
命令
绑定到我的命令,并将
DataGird
SelectedItems
SelectedIndex
传递到
命令

但是这个命令没有被调用。即使它能工作,当我调查某个方法是否达到目标(如set property
tag
)时,该参数也不能通过

所以,我想知道什么是正确的方法

概述

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