2016-10-11 4 views
-1

Я создаю динамическое контекстное меню. Чтобы это произошло, я пришел с настраиваемой ViewModel, который представляет мой ContextMenu, определяются следующим образом:Bind CommandParameter к свойству объекта-объекта

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

Свойство Items имеет эффективные команды, чтобы показать в Контекстном и свойстве ContextItem имеет контекстно-элемент, эти команды должны быть выполнены.

Кроме того, у меня есть одноэлементный класс, который содержит все мои различные команды и их реализацию. Так что в конце концов будет метод, который будет вызываться UpdateContextMenu на ViewModel, владеющей Контекстное, что делает что-то вроде этого:

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

Контекстное iteself в XAML определяется следующим образом:

<ContextMenu ItemsSource="{Binding Path=ContextMenu.Items}"> 
    <ContextMenu.ItemTemplate> 
    <DataTemplate> 
     <ContentControl> 
     <MenuItem Command="{Binding}" CommandParameter="what-goes-here?" /> 
     </ContentControl> 
    </DataTemplate> 
    </ContextMenu.ItemTemplate> 
</ContextMenu> 

Чего я не могу добиться, так это получение привязки CommandParameter к работе. Как я должен привязываться к свойству ContextItem экземпляра ContextMenuVM?

ответ

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.

Смежные вопросы