2012-12-11 26 views
7

Đây là mã của tôi từ View.xaml.cs:Làm cách nào để bạn liên kết lệnh với MenuItem (WPF)?

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

public void OnClose() 
{ 
    Close(); 
} 

Và đây là một số mã từ View.xaml tôi:

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

Khi tôi chạy chương trình và chọn mục trình đơn gần , chẳng có gì xảy ra. Mã CloseCommand thậm chí không được thực thi.

+0

Bạn đã đặt DataContext chưa? –

+0

Tôi đã tìm ra giải pháp cho vấn đề của mình. Tôi đã sử dụng một ViewModel mà có một tài sản trong đó là một loại ViewModel và tôi cần phải phạm vi xuống đó bằng cách làm điều này: 'Command =" {Binding ActiveVM.CloseCommand} "' –

+0

Tôi đã tìm thấy một giải pháp cho câu hỏi của bạn [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

Trả lời

8

ContextMenu không phải là một phần của VisualTree, đó là lý do tại sao DataContext sẽ không được kế thừa. Dưới đây ContextMenu.PlacementTarget là một số loại rơle để có được những Window:

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

Bạn có chắc chắn nó không nhận được 'DataContext'? Trong thử nghiệm của tôi có vẻ như được kế thừa DataContext như bạn mong đợi ... – McGarnagle

+0

Tôi đã thử mã của bạn cho Command = "..." nhưng nó không hoạt động - giống như trước đây - không có gì vui vẻ. –

+0

@dbaseman Theo [this] (http://msdn.microsoft.com/en-us/library/ms749018.aspx#PopupandtheVisualTree) Popup tạo ra visualtree của riêng mình. Điều này có nghĩa là không có kế thừa DataContext cho ContextMenu được đặt trong Popup. – LPL

0

Cũ câu hỏi, câu trả lời mới . Đối với tôi, vấn đề là GalaSoft.MvvmLight.Command.RelayCommand không hỗ trợ đóng cho hành động. RelayCommand lưu trữ một tham chiếu yếu đến hành động để một đóng cửa được deallocated gần như ngay lập tức. Hành động phải là một phương thức mô hình hoặc được giữ lại theo một cách khác.