2017-06-30 14 views
1

私は把握できないWPFバインディングの問題が発生しています。コンテキストメニューがDataTemplatに使用されている、との国境にタグのための結合が正しくPropertyEditorViewを見つけることですWPFコンテキストメニューはVIewModelプロパティにバインドされません

<ContextMenu x:Key="CopyPasteContextMenu"> 
    <MenuItem Header="AlternateDelete" 
       Command="{Binding Path=PlacementTarget.Tag.DataContext.AlternateDeleteCommand, 
       RelativeSource={RelativeSource Self}, Mode=OneWay}"/> 
</ContextMenu> 

、私はちょうどそれを得ることができない:私は、図示のようにフォーマットされたContextMenuテンプレートを持っています境界線からコンテキストメニューに移動します。

<DataTemplate x:Key="PropertyValueCellViewingTemplate" DataType="viewModels:IConfigurationItemViewModel"> 
    <Border x:Name="ValueCellBorder" 
      Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type views:PropertyEditorView}}}" 
      ContextMenu="{StaticResource CopyPasteContextMenu}" 
      Style="{StaticResource PropertyGridValueCellBorderStyle}"> 
     (...) 
    </Border> 
</DataTemplate> 

このタグは、「PropertyEditorViewModel」と呼ばれるビューモデルに正しくバインドできます。ビジュアルツリーでシステムをデバッグする際にこれを見ることができます。コンテキストメニューにドリルダウンすると、バインドが適切に行われていません。

私のコマンドが機能するためには、Command to PropertyEditorViewビューモデルコマンド "AlternateDeleteCommand"に適切にバインドする必要があります。

public class PropertyEditorViewModel : DisposableViewModelBase, IPropertyEditorViewModel 
{ 
    public ICommand AlternateDeleteCommand { get; set; } 

これまでのところ、私のバインディングがコンテキストメニューで動作していない理由がわかりません。だれかが迷っていますか?

ありがとうございます!

+0

私は簡単なテストをした、とのMenuItemは、コンテキストメニューのターゲットのDataContextのを継承していることがわかった - 例えば、私は 'PropertyEditorViewModel'はDataTemplateをのDataContextのであればという期待、それゆえDataTemplate内のBorderがMenuItem内にある場合、 'Command =" {Binding AlternateDeleteCommand} "'が動作します。 –

+0

バインディングが失敗する(またはそうであると思われる)理由が不明な場合は、常にPresentationTraceSources.TraceLevel = Highをそれに追加してください。これは、バインディングが更新されるたびに実行時に多くの行のデバッグ情報をVS出力ペインに表示します。それはソースプロパティを見つけるために何をしているのかを正確に教えてくれます。失敗した場合は、どこで、なぜそれが表示されます。 –

+0

私はJMが以下に示唆したようにそれを試していましたが、それがうまくいったので、データテンプレートに戻しました。ありがとうございました! –

答えて

0

相対ソースは、メニュー項目ではなくコンテキストメニューにある必要はありませんか?コンテキストメニューのプレースメントターゲットを確認していますか?

<MenuItem Header="AlternateDelete" 
      Command="{Binding Path=PlacementTarget.Tag.DataContext.AlternateDeleteCommand, 
      RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Mode=OneWay}" /> 
+0

ありがとうございました! –

関連する問題