2013-07-11 20 views
0

У меня была проблема с TreeView-Binding и ContextMenu здесь: Selected TreeViewItem is nullBind Заголовок WPF ContextMenu

Теперь я с этой проблемой: у меня есть ContextMenu

<TreeView.ContextMenu> 
    <ContextMenu x:Name="MyContext" ItemsSource="{Binding OCContext}" DisplayMemberPath="Text"/> 
</TreeView.ContextMenu> 

http://i.stack.imgur.com/4gA1l.png

(Изображение показывает, как выглядит мой ContextMenu, не обращайте внимания на tabItem ...).

Как вы можете видеть, это просто ContetMenu, нет MenuItem! Если пользователь нажимает кнопку «Закрыть», я хочу что-то сделать в моей модели ViewModel (поднять команду?). Я также хотел бы узнать, какую кнопку/меню он щелкнул. Количество меню динамически, так как он привязан к ItemsSource.

Это мой ViewModel:

private ObservableCollection<T_Antwort> _occontext; 
public ObservableCollection<T_Antwort> OCContext 
{ 
    get 
    { 
     if (_occontext == null) 
      _occontext = new ObservableCollection<T_Antwort>(); 
     return _occontext; 
    } 
    set 
    { 
     _occontext = value; 
     RaisePropertyChanged(() => OCContext); 
    } 
} 

Так все, что я хочу сделать, это связать ContextMenu (The «пунктов» Закрыть и CloseOtherThankThis) на мой ViewModel, поэтому, когда пользователь нажимает на одну из них, Я хочу получить к ним доступ в моей модели ViewModel. Это означает, что я не хочу связывать их один за другим, я хочу каким-то образом получить событие (ContextMenuItemClicked (?)), Которое вызывается, и использовать его в моей ViewModel.

КПП. с помощью MenuItem под ContextMenu создаст еще одну "папку Menu", поэтому было бы

"" -> Закрыть

"" -> CloseOtherThankThis

И я не хочу, чтобы это выглядело, как это.

Edit: Я в настоящее время получаю деталь, как это:

private void MyContext_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     System.Windows.Controls.Primitives.MenuBase s = sender as System.Windows.Controls.Primitives.MenuBase; 
     ItemCollection ic = s.Items; 
     T_Antwort SelectedItem = (T_Antwort)ic.CurrentItem; 
    } 

Есть ли возможность получить выбранный элемент с обязательным?

ответ

0

Не знаю, пробовали ли вы это, но есть контекстное меню PlacementTarget, которое дает вам объект, содержащий контекстное меню.

В одном проекте у меня был, я сделал что-то вроде этого:

<MenuItem ... Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContextMenu}},Path=PlacementTarget.SelectedItem 
+0

Спасибо, но я не знаю, где я должен его использовать. Я пробовал это с помощью MenuItem и CommandBinding с указанным выше как CommandParameter, но команда не выполняется? .. 'Command =" {Binding asd} "CommandParameter =" {Binding RelativeSource = {RelativeSource Mode = FindAncestor, AncestorType = {x: Тип ContextMenu}}, Path = PlacementTarget.SelectedItem} ", VM' asd = new RelayCommand (asdexecute); '. Это также второй узел, поэтому MenuItem не подходит. – Rudi

+0

Я не знаю о mvvm ... извините ... Я говорил в традиционном wpf. Если вам нужен пример, я могу дать вам полный пример в традиционном wpf. – sexta13

+1

Нет, это нормально, но спасибо. – Rudi