0

我的目标:右键单击我的 ListView 中的特定项目,弹出一个上下文菜单,选择一个命令,然后我根据选择的项目的上下文菜单运行一个函数。

我的 ListView 的 ItemsSource 绑定到 CollectionViewSource,其来源是“Items”的 ObservableCollection。(ListView, binds -> CollectionViewSource, source -> ObservableCollection of class "Item")

我试图做的是将一个通用的 ContextMenu 添加到列表视图中的所有“项目”中,并且当为列表视图中的项目选择上下文菜单项时,将运行一个命令。我能够让命令在一般情况下运行,但我无法获得有关选择上下文菜单的特定项目的任何信息/参数。

在此示例中,“Item”类有一个名为 host 的字符串,我想将 host 字符串传递给 RefundRequestCommand,但我无法传递任何 CommandParameters。

我已经阅读了一些关于创建和使用数据模板的内容,但没有成功。任何人都可以指导我/帮助我吗?

这里有一些代码供参考:

列表显示:

<ListView x:Name="ordersList" Margin="0,10,10,0" BorderThickness="2" Grid.Column="2" Grid.Row="0" Grid.RowSpan="2" HorizontalAlignment="Stretch" ItemsSource="{Binding Source={StaticResource cvsOrders}}" SelectionChanged="ordersList_SelectionChanged" SelectedIndex="0" SelectionMode="Extended">
            <ListView.Resources>
                <local:RefundRequestCommand x:Key="refund"></local:RefundRequestCommand>
            </ListView.Resources>
            <ListView.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="test" Command="{StaticResource refund}" CommandParameter="{Binding host}"></MenuItem>
                </ContextMenu>
            </ListView.ContextMenu>
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="140">
                        <GridViewColumnHeader Name="OrderNumber" Click="sortClick" Tag="orderNumber" Content="Order Number" />
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding orderNumber}" TextAlignment="Center"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
        //On and On.....

命令:

class RefundRequestCommand : ICommand
{
    TreeViewFilter treeViewFilter;

    public void Execute(object parameter)
    {
        string host = (string)parameter;
        Console.WriteLine(host);  //FOR TESTING
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
}
4

1 回答 1

0

实际上,您正在为 ListView 设置 ContextMenu,但您想将 ListViewItem 传递到那里。您应该为 ListViewItem 设置上下文菜单。尝试这个。

<local:RefundRequestCommand x:Key="refund"/>

    <Style x:Key="MyLVItemStyle" TargetType="ListViewItem">
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu>
                    <MenuItem Header="test" 
                              Command="{StaticResource refund}" 
                              CommandParameter="{Binding host}">
                    </MenuItem>
                </ContextMenu>
            </Setter.Value>
        </Setter>
    </Style>

并像你一样使用它

  <ListView x:Name="ordersList" Margin="0,10,10,0" BorderThickness="2" Grid.Column="2" Grid.Row="0" Grid.RowSpan="2" HorizontalAlignment="Stretch" 
              ItemsSource="{Binding Rectangles}" SelectedIndex="0" SelectionMode="Extended" ItemContainerStyle="{StaticResource MyLVItemStyle}">
......

您还删除了 ListView 中应用的样式,它应该可以工作。

于 2013-01-16T02:27:39.910 回答