2012-12-11 12 views
7

Oto mój kod z View.xaml.cs:Jak powiązać polecenie z MenuItem (WPF)?

private RelayCommand _closeCommand; 
public ICommand CloseCommand 
{ 
    get 
    { 
     if (_closeCommand == null) 
     { 
      _closeCommand = new RelayCommand(param => this.OnClose()); 
     } 
     return _closeCommand; 
    } 
} 

public void OnClose() 
{ 
    Close(); 
} 

A oto niektóre kodu z mojego View.xaml:

<Window.ContextMenu> 
    <ContextMenu> 
     <MenuItem Name="menuItem_Close" Header="Close" Command="{Binding CloseCommand}" /> 
    </ContextMenu> 
</Window.ContextMenu> 

Kiedy uruchomić program i wybrać pozycję menu bliskie , nic się nie dzieje. Kod CloseCommand nawet nie zostanie wykonany.

+0

Czy ustawiłeś DataContext? –

+0

Znalazłem rozwiązanie mojego problemu. Używałem ViewModel, który miał właściwość w nim, który był inny typ ViewModel i musiałem zasięg do tego propery, wykonując to: 'Polecenie =" {Wiążące ActiveVM.CloseCommand} "' –

+0

Znalazłem rozwiązanie twojego pytania [http://stackoverflow.com/questions/898852/specify-command-for-menuitem-in-a-datatemplate/18362041#18362041][1] [1], http: // StackOverflow. com/questions/898852/specify-command-for-menuitem-in-a-datatemplate/18362041 # 18362041 – Jacksquad

Odpowiedz

8

ContextMenu nie jest częścią VisualTree, dlatego DataContext nie będzie dziedziczony. Tutaj ContextMenu.PlacementTarget jest jakiś przekaźnik, aby uzyskać Window:

<MenuItem Name="menuItem_Close" Header="Close" 
      Command="{Binding Path=PlacementTarget.DataContext.CloseCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" /> 
+0

Czy jesteś pewien, że nie otrzymałeś "DataContext"? W moim teście wydaje się dziedziczenie DataContext, jak można się spodziewać ... – McGarnagle

+0

Próbowałem twój kod dla Command = "...", ale nie działa - tak jak wcześniej - nic się nie stało. –

+0

@dbaseman Zgodnie z [this] (http://msdn.microsoft.com/en-us/library/ms749018.aspx#PopupandtheVisualTree) Popup tworzy własny wizualny widok. Oznacza to brak dziedziczenia DataContext dla ContextMenu, które jest umieszczone w Popup. – LPL

0

Stare pytanie, nowa odpowiedź . Dla mnie problemem było to, że GalaSoft.MvvmLight.Command.RelayCommand nie obsługuje zamknięć dla akcji. RelayCommand przechowuje słabe odniesienie do akcji, więc zamknięcie zostaje zwolnione niemal natychmiast. Akcja musi być metodą modelową lub zostać zachowana w inny sposób.

Powiązane problemy