11

コンテキストメニューをコマンドのリストにバインドしたい。

<Grid.ContextMenu>
    <ContextMenu ItemsSource="{Binding ItemContextCommands, Converter={StaticResource commandToStringConverter}}">
            <ContextMenu.ItemTemplate >
                    <DataTemplate DataType="MenuItem">
                            <MenuItem Command="{Binding}"></MenuItem>
                        </DataTemplate>
                </ContextMenu.ItemTemplate>
        </ContextMenu>
</Grid.ContextMenu>

commandToStringConverter、コマンドのリストを文字列のリストに変換するだけToString()で、リスト内の各コマンドで を呼び出します。

Commandin eachMenuItemが呼び出されるようにするにはどうすればよいですか?

4

3 に答える 3

20

そのようなコマンドの情報を保持するために、小さな「ビューモデル」を使用します。

class ContextAction : INotifyPropertyChanged
{
    public string Name;
    public ICommand Action;
    public Brush Icon;
}

ビューモデル内にコレクションを作成し、次のようなコンテキストアクションを取得する必要があります

ObservableCollection<ContextAction> Actions {get;set;}

このコレクションをにバインドするだけContextMenuです。

<Grid.ContextMenu>
    <ContextMenu ItemsSource="{Binding Actions}" />

これItemTemplateで、コンテキストメニュー項目のは、名前、コマンド、およびその他の必要なものにアクセスできます。CommandParameterアクション自体ではなく、アクションを所有する要素を使用してコマンドを呼び出すように、も変更すると便利な場合があります。

于 2013-03-22T09:44:45.597 に答える
14

私はこのようなものを使用します:

public class ContextMenuVM
{ 
    public string Displayname {get;set;}
    public ICommand MyContextMenuCommand {get;set;}
}

あなたのコンテキストメニューのデータコンテキストで:

public ObservableCollection<ContextMenuVM> MyCommandList {get;set;}

あなたのxamlで

<ContextMenu ItemsSource="{Binding MyCommandList}">
        <ContextMenu.ItemTemplate >
                <DataTemplate DataType="MenuItem">
                        <MenuItem Header="{Binding Displayname}" Command="{Binding MyContextMenuCommand}"></MenuItem>
                    </DataTemplate>
            </ContextMenu.ItemTemplate>
    </ContextMenu>

それはideなしで書かれているので、そこにいくつかの構文エラーがあるかもしれません

于 2013-03-22T09:48:37.477 に答える