私は WPF アプリケーションに取り組んでおり、MVVM パターンを使用しています。MVVMLight を使用して、いくつかのイベントを処理しています。どのアイテムがイベントを送信したかを確実に知ることができるように、引数も渡すことができるように、「クリック」イベントを転送する必要があります。「コマンド」を使用すると、イベントを送信したのが選択されたアイテムであったことを確認できません-アイテムを選択して右クリックする必要がないためです。
これは、「注文明細」のリストを表示するための私のコードです。注文明細行には 2 つのタイプがあり、データ タイプの 1 つです。「AccessoryOrderLine」 - コンテキスト メニューを追加したい。
私の問題は、ウィンドウの DataContext にアクセスできないことです。ウィンドウのルート ノードに「ルート」という名前を付け、ルートの DataContext にアクセスしようとしていますが、次のエラーで失敗します。
System.Windows.Data エラー: 4 : 参照 'ElementName=root' でバインディングのソースが見つかりません。BindingExpression:Path=DataContext.PackAccessory; DataItem=null; ターゲット要素は 'EventToCommand' (HashCode=5903270) です。ターゲット プロパティは 'Command' (タイプ 'ICommand') です。
<ListBox HorizontalContentAlignment="Stretch" Margin="10,0,10,10" DockPanel.Dock="Bottom" Grid.Row="1" ItemsSource="{Binding OrderLines, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True, UpdateSourceTrigger=PropertyChanged}">
<ListBox.Resources>
<DataTemplate DataType="{x:Type m:UnitOrderLine}">
<v:OrderLine />
</DataTemplate>
<DataTemplate DataType="{x:Type m:AccessoryOrderLine}">
<v:OrderLine>
<v:OrderLine.ContextMenu>
<ContextMenu>
<MenuItem Header="Pack 1" IsCheckable="False">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding ElementName=root, Path=DataContext.PackAccessory }" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</MenuItem>
</ContextMenu>
</v:OrderLine.ContextMenu>
</v:OrderLine>
</DataTemplate>
</ListBox.Resources>
</ListBox>
「TemplatedParent」も使用しようとしましたが、「OrderLine」DataContext にアクセスできましたが、「MainWindowModel」にさらに一歩戻ることはできません。
私の問題の解決策を見つけました:)