2010-05-25 14 views
7

Ktoś wie, dlaczego powiązanie pozycji menu nie działa?Menu WPFItem IsChecked Nie działa bindowanie

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

Odpowiedz

8

Zgaduję, że to contextmenu masz problem, korzystając z danych wiążące.

ToggleButton nie jest logicznym drzewa ContextMenu więc nie może znaleźć ToggleButton korzystając ElementName patrz http://blogs.msdn.com/b/mikehillberg/archive/2008/05/23/of-logical-and-visual-trees-in-wpf.aspx

Dlatego pojawi się błąd za który wiąże w oknie wyjściowym w 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')

aby ustalić, spojrzeć w górę przycisk przełączania za pomocą FindAncestor:

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

Kiedy pierwszy raz przeczytałem to, że nie zdawali sobie sprawy, że mają * * wiązać się swoimi dane teleadresowe our za pośrednictwem właściwości ContextMenu.PlacementTarget (zamiast, powiedzmy, czegoś innego pochodzącego z rozszerzenia RelativeSource), ponieważ jest to sposób na powrót do wizualnego drzewa kontrolki zawierającej. Jednak to było prawdopodobnie tylko bycie nieco powolnym i mam to teraz (i naprawiłem mój problem). Dzięki za pomoc. +1. –

Powiązane problemy