2016-08-28 3 views
1

다른 모양과 기능을 가진 상황에 맞는 메뉴 항목을 제공하려고하지만 이러한 항목에 명령을 바인딩하는 방법을 찾을 수 없습니다. 각 메뉴 항목의보기 모델은 하나의 클래스 AbstractEntryViewModel에서 파생됩니다. 다음은 현재 프로젝트의 구조를 요약 한 예입니다. ContextMenu.Resources을 사용하면 템플릿을 특정 유형에 바인딩하는 유일한 방법입니다.여러 템플릿을 사용할 때`ContextMenu`에서`DataTemplate`에 명령을 바인드 하시겠습니까?

<ContextMenu ItemsSource="{Binding Entries}"> 
    <ContextMenu.Resources> 

     <DataTemplate DataType="{x:Type local:NopEntryViewModel}"> 
      <!-- Content --> 
     </DataTemplate> 

     <HierarchicalDataTemplate 
      DataType="{x:Type local:GroupEntryViewModel}" 
      ItemsSource="{Binding Entries}"> 
      <!-- Content --> 
     </HierarchicalDataTemplate> 

     <!-- More templates --> 

    </ContextMenu.Resources> 
</ContextMenu> 
internal abstract AbstractEntryViewModel : INotifyPropertyChanged { 
    public abstract void Invoke(); 
    // ... 
} 

internal NopEntryViewModel : AbstractEntryViewModel { 
    public override void Invoke() {} 
} 

internal GroupEntryViewModel : AbstractEntryViewModel { 
    public override void Invoke() { /* ... */ } 
    // ... 
} 

// More view models 

은 일반적으로 내가 어떻게 데이터 템플릿과 같은 일을 할 수있는 MenuItem

<MenuItem Command="{Binding StaticResourceOrViewModelProperty}" /> 

과 같이에 명령을 결합 할 수있다? 거기에 보이지 않는 컨테이너, 데이터 템플릿의 내용에 대한 래퍼, 내가 명령을 바인딩하는 데 사용할 수 있습니까? 편의상

답변

2

는 각각 CommandCommand1Command2으로 2 유도 ViewModels, VM1VM2 가정한다.

두 단계 :

public Type Type 
{ 
    get { return GetType(); } 
} 

우리는 GetType() 직접, 우리는 속성 WPF Bindings 일부터 포장 프로퍼티를 필요로 사용할 수 없습니다

1) 기본 ViewModel에서이 속성을 정의합니다.

2)의 StyleDataTrigger을 설정하려면이 속성을 사용하여 ContextMenuMenuItem :

<DataTemplate DataType="{x:Type local:VM1}"> 
    <!-- Content --> 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:VM2}"> 
    <!-- Content --> 
</DataTemplate> 
+2

WOW, 매력처럼 작동합니다

<ContextMenu.Resources> <Style TargetType="{x:Type MenuItem}"> <Style.Triggers> <DataTrigger Binding="{Binding Type}" Value="{x:Type local:VM1}"> <Setter Property="Command" Value="{Binding Command1}"/> </DataTrigger> <DataTrigger Binding="{Binding Type}" Value="{x:Type local:VM2}"> <Setter Property="Command" Value="{Binding Command2}"/> </DataTrigger> <!-- add other DataTriggers, one for every ViewModel --> </Style.Triggers> </Style> </ContextMenu.Resources> 

당신이 같이 DataTemplates가 함께 설정이

MVVM을 깨뜨리지 않습니다 :) 추가 설정자 인 '을 사용하면 실제 뷰 모델 인스턴스가 명령에 전달됩니다. 고마워요 :) – Cubinator73