WPF菜单项的IsChecked绑定不起作用

7
有人知道为什么菜单项绑定不起作用吗?
<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
我猜测您在使用数据绑定时遇到了上下文菜单的问题。
ToggleButton不在上下文菜单的逻辑树中,因此无法使用ElementName找到ToggleButton,请参见链接
这就是为什么您会在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查找ToggleButton。
<MenuItem 
  Header="Block" 
  IsCheckable="True" 
  IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.IsChecked}" />
      

1
当我第一次阅读这篇文章时,我没有意识到你必须通过ContextMenu.PlacementTarget属性绑定数据源(而不是通过RelativeSource扩展获取其他任何东西),因为这是回到包含控件的可视树的方法。然而,那可能只是我有点慢,现在我已经明白了(并解决了我的问题)。感谢您的帮助。+1。 - Mal Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接