2010-05-25 37 views
7

Bất cứ ai cũng biết tại sao ràng buộc mục menu không hoạt động?WPF MenuItem IsChecked Binding không hoạt động

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

Trả lời

8

Tôi đoán rằng đó là ngữ cảnh bạn gặp sự cố khi sử dụng ràng buộc dữ liệu.

Các togglebutton không có trong cây logic của ContextMenu vì thế nó không thể tìm thấy togglebutton sử dụng ElementName, xem http://blogs.msdn.com/b/mikehillberg/archive/2008/05/23/of-logical-and-visual-trees-in-wpf.aspx

Đó là lý do tại sao bạn nhận được một lỗi cho điều đó ràng buộc trong cửa sổ đầu ra của bạn trong 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')

để khắc phục, nhìn lên nút Toggle sử dụng FindAncestor:

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

Khi tôi lần đầu tiên đọc này, tôi đã không nhận ra rằng bạn * phải * để liên kết với dữ liệu ngay của bạn ource thông qua thuộc tính ContextMenu.PlacementTarget (thay vì, nói, bất cứ điều gì khác có nguồn gốc thông qua phần mở rộng RelativeSource), vì đó là cách để quay trở lại cây trực quan của điều khiển chứa. Tuy nhiên, đó có lẽ chỉ là tôi chậm một chút và bây giờ tôi đã có nó (và cố định vấn đề của tôi). Cảm ơn đã giúp đỡ. +1. –

Các vấn đề liên quan