在WPF中,如何从绑定到ListView的Collection View Source中的特定项获取命令参数?

时间:2013-01-15 20:19:26

标签: wpf listview command datatemplate commandparameter

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

我的ListView的ItemsSource被绑定到一个CollectionViewSource,其源是一个ObservableCollection“Items”。 (ListView,绑定 - > CollectionViewSource,source - >类ObservableCollection“Item”)

我尝试做的是将一般ContextMenu添加到listview中的所有“Items”,并且当为ListView中的项目选择上下文菜单项时,则运行命令。我能够得到命令一般运行,但我无法获得有关选择了上下文菜单的特定项目的任何信息/参数。

在这个例子中,“Item”类有一个名为host的字符串,我想将主机字符串传递给RefundRequestCommand,但我还没能传递任何CommandParameters。

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

以下是一些供参考的代码:

的ListView:

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

1 个答案:

答案 0 :(得分: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一样

  <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中应用的样式,它应该可以正常工作。