В WPF, как получить параметр команды из определенного элемента в источнике представления коллекции, который привязан к ListView?

Моя цель: щелкните правой кнопкой мыши определенный элемент в моем ListView, появится контекстное меню, выберите команду, после чего я запустил функцию, основанную на том, контекстное меню какого элемента было выбрано.

ItemsSource моего ListView ограничен CollectionViewSource, источником которого является ObservableCollection "Items". (ListView, привязки -> CollectionViewSource, источник -> ObservableCollection класса "Элемент")

Что я пытался сделать, так это добавить общий ContextMenu ко всем «Элементам» в списке, и когда элемент контекстного меню выбирается для элемента в ListView, запускается команда. Мне удалось запустить команду в целом, но я не смог получить какую-либо информацию/параметры о конкретном элементе, контекстное меню которого было выбрано.

В этом примере класс «Элемент» имеет строку с именем хост, и я хочу передать строку хоста в 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;
}

person Kevin Quiring    schedule 15.01.2013    source источник


Ответы (1)


На самом деле вы устанавливаете ContextMenu для ListView, но хотите передать туда 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, и он должен работать.

person D J    schedule 16.01.2013