0

私の目標: ListView の特定の項目を右クリックすると、コンテキスト メニューがポップアップ表示され、コマンドを選択した後、どの項目のコンテキスト メニューが選択されたかに基づいて関数を実行します。

私の ListView の ItemsSource は CollectionViewSource にバインドされており、そのソースは "Items" の ObservableCollection です。(ListView、バインド -> CollectionViewSource、ソース -> クラス「Item」の ObservableCollection)

私がやろうとしたことは、リストビューのすべての「アイテム」に一般的な ContextMenu を追加することです。ListView のアイテムに対してコンテキスト メニュー アイテムが選択されると、コマンドが実行されます。コマンドを一般的に実行することはできましたが、コンテキスト メニューが選択された特定の項目に関する情報やパラメータを取得できませんでした。

この例では、"Item" クラスに 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 に答える