2010-05-25 11 views
7

¿Alguien sabe por qué el enlace del elemento de menú no funciona?WPF MenuItem IsChecked La vinculación no funciona

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

Respuesta

8

que supongo que es el menú contextual tiene problemas usando vinculantes con los datos.

ToggleButton no está en el árbol lógico del menú contextual para que no pueda encontrar el togglebutton usando ElementName, ver http://blogs.msdn.com/b/mikehillberg/archive/2008/05/23/of-logical-and-visual-trees-in-wpf.aspx

Por eso se produce un error para que la unión en su ventana de salida en VS:

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

para fijar, buscar el botón de activación utilizando FindAncestor:

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

primera vez que leí esto, no se dio cuenta de que tiene * * para unirse a sus datos a través de la propiedad ContextMenu.PlacementTarget (en lugar de, por ejemplo, cualquier otra fuente a través de la extensión RelativeSource), ya que es la forma de volver al árbol visual del control contenedor. Sin embargo, probablemente solo fui yo un poco lento y ahora lo tengo (y solucioné mi problema). Gracias por la ayuda. +1. –

Cuestiones relacionadas