2016-10-11 1 views
-1

動的コンテキストメニューを構築しています。それを実現するために、私は、私のコンテキストメニューを表しカスタムのviewmodelを思い付くこのように定義されています:CommandParameterを所有オブジェクトのプロパティにバインドします。

public class ContextMenuVM { 
    public object ContextItem { get; set; } 
    public ObservableCollection<ICommand> Items { get; private set; } 
} 

プロパティをItemsは、コンテキストメニューに表示するために効果的なコマンドを保持し、プロパティContextItem、そのコンテキスト・アイテムを保持していますこれらのコマンドは実行されます。

さらに、私は私のさまざまなコマンドとその実装をすべて保持するシングルトンクラスを持っています。

ContextMenu.Items.Clear(); 
ContextMenu.Items.Add(SingletonClass.Instance.CommandA); 
if (condition) 
    ContextMenu.Items.Add(SingletonClass.Instance.CommandB); 

XAMLでのContextMenu iteselfこのように定義されています:

<ContextMenu ItemsSource="{Binding Path=ContextMenu.Items}"> 
    <ContextMenu.ItemTemplate> 
    <DataTemplate> 
     <ContentControl> 
     <MenuItem Command="{Binding}" CommandParameter="what-goes-here?" /> 
     </ContentControl> 
    </DataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 
だから、最終的にはこのような何かをしてコンテキストメニューを所有しているのviewmodelに UpdateContextMenuと呼ばれる方法があるでしょう

私が達成できないのは、CommandParameterバインディングが機能するようにすることです。 ContextMenuVMインスタンスのContextItemプロパティにバインドする方法を教えてください。

答えて

0

いいえ、Minimal, Complete, and Verifiable code exampleあなたが行っていることをはっきりと示していますが、確かに知ることは不可能です。しかし、これまでに提供した情報に基づいて、RelativeSourceバインディングソースを探しているようです。例えば:

<ContextMenu ItemsSource="{Binding Path=ContextMenu.Items}"> 
    <ContextMenu.ItemTemplate> 
    <DataTemplate> 
     <ContentControl> 
     <MenuItem Command="{Binding}" 
        CommandParameter="{Binding ContextMenu.ContextItem 
         RelativeSource={RelativeSource AncestorType=ContextMenu}}"/> 
     </ContentControl> 
    </DataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 

あなたの元のコードの例が完了していないので、私は、あなたのItemsSource結合に基づいて、結合パスのような推測をしなければなりませんでした。基本的な考え方は、指定されたソースに関連するパスにバインドすることです。したがって、ContextMenuは、使用しているContextMenuVMオブジェクトを返すプロパティを参照すると仮定しています。

これで問題が解決しない場合は、良いMCVEを提供して改善してください。

関連する問題