2010-05-25 19 views
7

Qualcuno sa perché il binding della voce di menu non funziona?WPF MenuItem IsChecked Binding not working

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

risposta

8

Sto indovinando che è il contextmenu avete problema utilizzando l'associazione dati con.

Il ToggleButton non è nella struttura logica del menu contestuale in modo che non riesce a trovare il ToggleButton utilizzando ElementName, vedere http://blogs.msdn.com/b/mikehillberg/archive/2008/05/23/of-logical-and-visual-trees-in-wpf.aspx

Questo è il motivo per cui si ottiene un errore per quello che lega nella finestra di output in 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')

per riparare, cercare il pulsante di commutazione utilizzando FindAncestor:

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

Quando ho letto questo, non mi rendevo conto che hai * * di legarsi ai vostri dati ource tramite la proprietà ContextMenu.PlacementTarget (piuttosto che, ad esempio, qualsiasi altra fonte tramite l'estensione RelativeSource), in quanto questo è il modo per tornare all'albero visivo del controllo contenente. Tuttavia, probabilmente ero solo un po 'lento e ora ce l'ho (e ho risolto il problema). Grazie per l'aiuto. +1. –