私はWPFを学び、ItemsSourceのデータバインディングによってObservableCollection
にバインドされたダイナミックメニューを開発しています。これを行うには、MenuItemを自動的にバインドするためのMenuItemViewModel
とHierarchicalDataTemplate
があります。メニューのトップレベルMenuItemへのコマンドバインディングが機能しません
問題は、Command
というプロパティがトップレベルのメニュー項目で機能しないことです。設定されているにもかかわらず、MenuItemはマウスクリックで反応せず、Commandを実行できないと無効になりません。単にそれが縛られていないようなものです。
低レベルのメニュー項目については、意図したとおりに動作します。私はこれが私のHierarchicalDataTemplate
の問題でなければならないと思うが、見つからない。トップレベルのMenuItemだけのコマンドバインディングに影響を与える可能性のあるコードはテンプレートにはないからだ。
MenuItemViewModel
はINotifyPropertyChanged
を実装し、パブリックプロパティを次のものが含まれます。次のように私の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のコレクションが空です)。
ItemControlのItemContainerStyleなどのコードも記述する必要があります。私はわかりませんが、HierarchicalDataTemplate.ItemContainerStyleを実装している場合は、コンテナ内のMenuItemにのみ適用されます。なぜなら、あなたが言っているのであれば、あなたのスタイルは最初のレイヤーに当てはまるのですか?menuItem(コンテナ)にあるmenuItem型の項目には、カスタムスタイルを追加します。 – sTrenat
@sTrenatそれはそれがどのように動作するのか...あなたは正しい思考を振った。ありがとうございました! – 1valdis