2017-06-30 5 views
1

Ich habe ein WPF-Bindungsproblem, das ich nicht herausfinden kann. Ich habe eine ContextMenu-Vorlage, die wie gezeigt formatiert ist:WPF-Kontextmenü bindet nicht an ViewModel-Eigenschaft

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

Das Kontextmenü wird in der DataTemplat verwendet wird, und für den Tag an der Grenze der Bindung richtig PropertyEditorView zu finden, ich kann es einfach nicht von der Grenze zum Kontextmenü.

<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> 

Das Tag kann ordnungsgemäß an mein Ansichtsmodell binden, das als "PropertyEditorViewModel" bezeichnet wird. Ich kann dies sehen, während ich das System im visuellen Baum debugge. Wenn ich in mein Kontextmenü drehe, geschieht die Bindung nicht richtig.

Damit mein Befehl funktioniert, muss er ordnungsgemäß an den PropertyEditorView-Ansichtsmodellbefehl "AlternateDeleteCommand" gebunden werden.

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

auf diese Sah so weit für einen Tag, und nicht sicher, warum meine Bindung ist nicht im Kontextmenü arbeitet, kann jeder etwas bekam ich dabei bin?

Danke!

+0

Ich habe gerade einen schnellen Test, festgestellt, dass die MenuItems die Datacontext des Ziels des Kontextmenüs erbt - zum Beispiel, würde ich erwarten, dass, wenn ein 'PropertyEditorViewModel' ist die Datacontext des Datatemplate, daher Wenn der Border in der DataTemplate, dann in der MenuItem, würde 'Command =" {Binding AlternateDeleteCommand} "' funktionieren. –

+0

Wenn Sie sich nicht sicher sind, warum eine Bindung fehlschlägt (oder zu sein scheint), fügen Sie ihr immer 'PresentationTraceSources.TraceLevel = High' hinzu. Dies führt dazu, dass zur Laufzeit immer dann, wenn die Bindung aktualisiert wird, viele Zeilen mit Debugging-Informationen im VS-Ausgabefenster angezeigt werden. Es wird Ihnen genau sagen, was es tut, um seine Quelleigenschaft zu finden, und wenn es fehlschlägt, wird es Ihnen sagen, wo und warum. –

+0

Ich habe versucht, mit dem, was JM unten vorgeschlagen und es funktioniert, also habe ich es wieder in die Datenvorlage verschoben und es funktionierte immer noch, sobald ich die relative Quelle auf das Kontextmenü eingestellt habe. Danke Ed! –

Antwort

0

Muss sich die relative Quelle nicht im Kontextmenü und nicht im Menü befinden? Da Sie das Placement-Ziel des Kontextmenüs überprüfen?

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

Danke das schien zu funktionieren! –

Verwandte Themen