2

ContextMenuを含むものを設計する必要がありますMenuItem。これには、ViewModelMenuItemの型のプロパティにバインドするより深いレベルのメニュー リストがあります。ObservableCollectionコードは次のようになります。

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, 
   RelativeSource={RelativeSource Self}}" >            
   ...                                                                                                                                                     
   <MenuItem Header="Map to account" >
       <ItemsControl ItemsSource="{Binding RelatedAccounts}" >                                        
           <ItemsControl.ItemTemplate>
               <DataTemplate>
                   <MenuItem Header="{Binding Number}" 
                        Command="{Binding PlacementTarget.DataContext.MapToAccountCommand, 
                        RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                        CommandParameter="{Binding}"
                   />                 
               </DataTemplate>
           </ItemsControl.ItemTemplate>                                        
       </ItemsControl>
   </MenuItem>
...
</ContextMenu>

アイデアは、ユーザーが UI から 1 つの支払い項目を右クリックし、[アカウントにマップ] メニュー項目に移動すると、メニュー項目のより深いレベルが表示され、ユーザーが選択できるすべての関連アカウントが一覧表示されます (へのItemsControlバインドを見ることができますRelatedAccounts)

すべてが正常に機能し、ViewModel から公開したすべての関連アカウントがコンテキスト メニューに正しく表示されます。ユーザーが 1 つのアカウントを右クリックすると、選択したアカウントの渡されたパラメーターで ViewModelのCommandプロパティが実行されます。MapToAccountCommand

しかし、私が望まない動作が 1 つあります。マウスが [アカウントにマップ] メニューよりも 1 レベル深くなると、実際にはメニュー項目のコレクション全体が強調表示されます。以下の写真をご覧ください。

ここに画像の説明を入力

上記は「USD Account 1」にマウスを合わせた場合です。

また、マウスが特定のアカウントではなく、より深いレベルのメニュー内の他の領域にある場合でも、ハイライト効果はまだそこにあります。画像を参照してください。

ここに画像の説明を入力

これは明らかに正しくありません。誰が私が間違ったことを教えてもらえますか? ありがとう!

4

1 に答える 1

6

MemnuItemしたがって、すでにバインドできるItemsControl独自のプロパティがあります。ItemsSource次のようなことを試してください:

<MenuItem Header="Map to account" ItemsSource="{Binding RelatedAccounts}" >                                        
     <MenuItem.ItemTemplate>
         <DataTemplate>
             <TextBlock Text="{Binding Number}"/>
         </DataTemplate>
     </MenuItem.ItemTemplate>                                        
     <MenuItem.ItemContainerStyle>
         <Style TargetType="{x:Type MenuItem}">
             <Setter Property="Command" Value="{Binding PlacementTarget.DataContext.MapToAccountCommand, 
                  RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
             <Setter Property="CommandParameter" Value="{Binding}"/>
         </Style>
     </MenuItem.ItemContainerStyle>
</MenuItem>

あなたの場合、アイテムItemsControlとして配置MenuItemするため、WPF がそれをラップしMenuItem、全体がリスト内の他のItemsControlものと 1 つの大きなものになります。MenuItemMenuItems

于 2013-07-03T13:30:40.843 に答える