WPF MenuItem IsChecked Привязка не работает - PullRequest
7 голосов
/ 25 мая 2010

Кто-нибудь знает, почему не работает привязка пункта меню?

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

1 Ответ

8 голосов
/ 25 мая 2010

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

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

Вот почему вы получаете ошибку для этой привязки в окне вывода в VS:

System.Windows.Data Ошибка: 4: не удается найти источник для связывания с ссылка 'ElementName = toggleButton'. BindingExpression: Path = IsChecked; DataItem = NULL; целевой элемент 'MenuItem' (Name = 'menuItemBlock'); целевое свойство IsChecked (введите 'Boolean')

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

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