2013-10-24 2 views
1

그래서 하루 종일이 벽으로 내 머리를 벽에 붙이고있었습니다.WPF - 바운드 명령을 실행하지 않는 자식이있는 MenuItem

내 WPF 응용 프로그램 (MVVM Light 사용)에서 viewmodels 컬렉션에 바인딩 된 컨텍스트 메뉴가 있는데 제대로 동작하지 않습니다. 내 메뉴를 만들 수 있고 MenuItems 동작 트리, 실행중인 명령 및 올바른 매개 변수를 통해 모든 것이 완벽하게 작동합니다. 저는 이것을 이용하여 사용자가 폴더에 항목을 추가 할 수있는 컨텍스트 메뉴를 만듭니다.

문제는 내가 컨텍스트 메뉴 항목에 하위 항목이 있으면 명령이 더 이상 실행되지 않는다는 것입니다. 따라서 하위 폴더가없는 폴더에만 항목을 추가 할 수 있습니다.

스눕을 사용하여이 문제를 조사했으며 DataContext가 MenuItem에 대해 올바르게 표시되고 명령이 올바르게 바인딩되어 있고 mousedown 이벤트가 시작됩니다.

문제는 MenuItem에 하위 항목이있는 경우 명령이 실행되지 않는다는 것입니다. 자식이없는 모든 항목, 명령은 문제없이 발췌됩니다.

정말 여기에 손실이 있습니다. 스택 오버플로 또는 MSDN 소셜의 모든 비슷한 질문에 답을 얻지 못했습니다.

내 바인딩을 스타일로 설정했습니다. DataSpy이 문서에서오고, 나에게 명령 매개 변수 여기

http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF

나의 usedcontrol의 데이터 컨텍스트를 사용할 수 있도록 설명 된대로 작동하는지

<utility:DataContextSpy x:Key="Spy" /> 

<!-- Context style (in UserControl.Resources) --> 

<Style x:Key="ContextMenuItemStyle" TargetType="{x:Type MenuItem}"> 
    <Setter Property="Header" Value="{Binding Header}"/> 
    <Setter Property="ItemsSource" Value="{Binding Children}"/> 
    <Setter Property="Command" Value="{Binding Command}" /> 
    <Setter Property="CommandParameter" Value="{Binding DataContext, Source={StaticResource Spy}" /> 
    <Setter Property="CommandTarget" Value="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/> 
</Style> 

<!-- Later in the control --> 
<ContextMenu ItemContainerStyle="{StaticResource ContextMenuItemStyle}" ItemsSource="{Binding MenuItems}" /> 

주에 사용되는 뷰 모델입니다 상황에 맞는 메뉴 여기

public interface IContextMenuItem 
{ 
    string Header { get; } 
    IEnumerable<IContextMenuItem> Children { get; } 
    ICommand Command { get; set; } 
} 

public class BasicContextMenuItem : ViewModelBase, IContextMenuItem 
{ 
    #region Declarations 

    private string _header; 
    private IEnumerable<IContextMenuItem> _children; 

    #endregion 

    #region Constructor 

    public BasicContextMenuItem(string header) 
    { 
     Header = header; 
     Children = new List<IContextMenuItem>(); 
    } 

    #endregion 

    #region Observables 

    public string Header 
    { 
     get { return _header; } 
     set 
     { 
      _header = value; 
      RaisePropertyChanged("Header"); 
     } 
    } 

    public IEnumerable<IContextMenuItem> Children 
    { 
     get { return _children; } 
     set 
     { 
      _children = value; 
      RaisePropertyChanged("Children"); 
     } 
    } 

    public ICommand Command { get; set; } 

    #endregion 
} 

상황에 맞는 항목이 실제로있는 방법 사용되었습니다.

MenuItems = new List<IContextMenuItem> 
{ 
    new BasicContextMenuItem("New Folder") { Command = NewFolderCommand} , 
    new BasicContextMenuItem("Delete Folder") { Command = DeleteFolderCommand }, 
    new BasicContextMenuItem("Rename") { Command = RenameFolderCommand }, 
}; 

public ICommand NewFolderCommand 
{ 
    get { return new RelayCommand<FolderViewModel>(NewFolder); } 
} 

private void NewFolder(FolderViewModel viewModel) 
{ 
    // Do work 
} 
+0

당신이 말하는 명령은 발사되지 않는 이유는 무엇입니까? – Nitin

+0

여기서'public ICommand Command {get; 세트; }'초기화 중입니까? – CarbineCoder

+0

@nit 실제 질문이 너무 명확하지 않았으므로 방금 질문을 업데이트했습니다. 내가 가지고있는 문제는 MenuItem에 자식이있는 경우 명령이 실행되지 않는다는 것입니다. 자식이없는 모든 항목, 명령은 문제없이 발췌됩니다. – catkins

답변

0

문제는 XAML 바인딩을 참조하십시오. 필요한 것은 HierarchicalDataTemplate 바인딩입니다. 이 코드는 내가 문제를 일으키는 것으로 믿는 아이들을위한 명령을 묶지 않는다.

확인이 도움이된다면 - 당신이 childmenuItem 클릭하면 Command binding not working in a dynamic MVVM Context Menu

관련 문제