我的目标:右键单击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;
}
答案 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中应用的样式,它应该可以正常工作。