2010-05-25 13 views
7

Wer weiß, warum die Menüelementbindung nicht funktioniert?WPF MenuItem IsChecked Binding funktioniert nicht

<ToggleButton Name="toggleButton" Checked="checkBoxPublish_Checked" > 
    <ToggleButton.Resources> 
     <converters:BooleanToHiddenVisibility x:Key="boolToVis"/> 
    </ToggleButton.Resources> 
    <Grid> 
     <Image Height="auto" HorizontalAlignment="Left" Margin="5" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="auto" /> 
     <Viewbox > 
      <TextBlock Text="Blocked" Opacity="0.7" Foreground="Red" Visibility="{Binding Path=IsChecked, ElementName=toggleButton, Converter={StaticResource boolToVis}}"/> 
     </Viewbox> 
    </Grid> 
    <ToggleButton.ContextMenu> 
     <ContextMenu StaysOpen="True" > 
      <MenuItem x:Name="menuItemBlock" Header="Block" Click="menuItemClick" IsCheckable="True" IsChecked="{Binding ElementName=toggleButton, Path=IsChecked}"/> 
      <MenuItem x:Name="menuItemIgnorePtz" Header="Ignore Ptz" Click="menuItemClick" IsCheckable="True" /> 
     </ContextMenu> 
    </ToggleButton.ContextMenu> 
</ToggleButton> 

Antwort

8

Ich vermute, dass es das contextmenu Sie Problem haben, ist die Datenbindung bei der Verwendung.

ToggleButton ist nicht in der logischen Struktur des contextmenu, damit es nicht die ToggleButton mit Element finden können, finden Sie http://blogs.msdn.com/b/mikehillberg/archive/2008/05/23/of-logical-and-visual-trees-in-wpf.aspx

Aus diesem Grund erhalten Sie einen Fehler, dass in Ihrem Ausgabefenster in VS Bindung:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=toggleButton'. BindingExpression:Path=IsChecked; DataItem=null; target element is 'MenuItem' (Name='menuItemBlock'); target property is 'IsChecked' (type 'Boolean')

zu beheben, auf den Schalter, mit FindAncestor nachschlagen:

<MenuItem 
    Header="Block" 
    IsCheckable="True" 
    IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.IsChecked}" /> 
+1

Als ich das zum ersten Mal las, war mir nicht bewusst, dass Sie * * haben Ihre Daten zu binden ource über die ContextMenu.PlacementTarget -Eigenschaft (und nicht etwa über die RelativeSource-Erweiterung), um auf diese Weise zur visuellen Struktur des enthaltenen Steuerelements zurückzukehren. Aber das war wahrscheinlich nur ein bisschen langsam und ich habe es jetzt (und behob mein Problem). Danke für die Hilfe. +1. –