2017-12-21 4 views
0

私はWPFを学び、ItemsSourceのデータバインディングによってObservableCollectionにバインドされたダイナミックメニューを開発しています。これを行うには、MenuItemを自動的にバインドするためのMenuItemViewModelHierarchicalDataTemplateがあります。メニューのトップレベルMenuItemへのコマンドバインディングが機能しません

問題は、Commandというプロパティがトップレベルのメニュー項目で機能しないことです。設定されているにもかかわらず、MenuItemはマウスクリックで反応せず、Commandを実行できないと無効になりません。単にそれが縛られていないようなものです。

低レベルのメニュー項目については、意図したとおりに動作します。私はこれが私のHierarchicalDataTemplateの問題でなければならないと思うが、見つからない。トップレベルのMenuItemだけのコマンドバインディングに影響を与える可能性のあるコードはテンプレートにはないからだ。

MenuItemViewModelINotifyPropertyChangedを実装し、パブリックプロパティを次のものが含まれます。次のように私のWindow.ResourcesでのMenuItemのため

string Text 
Uri ImageSource 
ICommand Command 
ObservableCollection<MenuItemViewModel> Children 

HierarchicalDataTemplateは次のとおりです。

<HierarchicalDataTemplate DataType="{x:Type common:MenuItemViewModel}" 
          ItemsSource="{Binding Path=Children}"> 

    <HierarchicalDataTemplate.ItemContainerStyle> 
     <Style TargetType="MenuItem"> 
      <Setter Property="Command" 
       Value="{Binding Command}" /> 
     </Style> 
    </HierarchicalDataTemplate.ItemContainerStyle> 

    <StackPanel Orientation="Horizontal"> 
     <Image Source="{Binding ImageSource}" /> 
     <TextBlock Text="{Binding Text}" VerticalAlignment="Center"/> 
    </StackPanel> 

</HierarchicalDataTemplate> 

あなたは私のミスで私をポイントしてくださいできますか?

EDIT:最上位のMenuItemに子がありません(関連付けられたViewModelのコレクションが空です)。

+1

ItemControlのItemContainerStyleなどのコードも記述する必要があります。私はわかりませんが、HierarchicalDataTemplate.ItemContainerStyleを実装している場合は、コンテナ内のMenuItemにのみ適用されます。なぜなら、あなたが言っているのであれば、あなたのスタイルは最初のレイヤーに当てはまるのですか?menuItem(コンテナ)にあるmenuItem型の項目には、カスタムスタイルを追加します。 – sTrenat

+0

@sTrenatそれはそれがどのように動作するのか...あなたは正しい思考を振った。ありがとうございました! – 1valdis

答えて

0

@sTrenat commentのおかげで、私は以下の解決策になりました。

<Menu.Resources> 
    <!-- cancel sharing of image so Icon will work properly --> 
    <Image x:Key="MenuIcon" Source="{Binding ImageSource}" x:Shared="False"/> 
</Menu.Resources> 

<Menu.ItemContainerStyle> 
    <Style TargetType="{x:Type MenuItem}" 
      BasedOn="{StaticResource {x:Type MenuItem}}"> 
     <Setter Property="Header" Value="{Binding Text}" /> 
     <Setter Property="Icon" Value="{StaticResource MenuIcon}"/> 
     <Setter Property="Command" Value="{Binding Command}"/> 
     <Setter Property="ItemsSource" Value="{Binding Children}" /> 

     <!-- centering MenuItem's Header --> 
     <Setter Property="HeaderTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding}" /> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 

     <!-- setting Icon to null when ImageSource isn't specified --> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ImageSource}" 
         Value="{x:Null}"> 
       <Setter Property="Icon" Value="{x:Null}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Menu.ItemContainerStyle> 
関連する問題