2010-05-25 3 views
7

Кто-нибудь знает, почему привязка элемента меню не работает?WPF MenuItem IsChecked Binding не работает

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

ответ

8

Я предполагаю, что это Контекстное у вас есть проблемы с помощью связывания данных с.

ToggleButton не в логическом дереве Контекстное поэтому он не может найти ToggleButton с помощью ELEMENTNAME см http://blogs.msdn.com/b/mikehillberg/archive/2008/05/23/of-logical-and-visual-trees-in-wpf.aspx

Вот почему вы получите ошибку в том, что связывание в выходном окне в 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')

чтобы исправить, посмотреть на кнопку переключения с помощью FindAncestor:

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

Когда я впервые прочитал это, я не понимаю, что вы * есть * связываться с вашими DATAS ource через свойство ContextMenu.PlacementTarget (а не, скажем, что-нибудь еще, полученное через расширение RelativeSource), так как это способ вернуться к визуальному дереву содержащего элемента управления. Тем не менее, это, вероятно, только я был немного медленным, и теперь я получил его (и исправил свою проблему). Спасибо за помощь. +1. –