Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"System.Windows.Data Error: 4" in a dynamic MenuItem

I have a WPF MenuControl to which I add several menu items at run-time. If you are interested in knowing, the reason is that we read the data from a database and need to create the MenuItems based on the data returned. We have what I'd say is a complex menu style (at least complex to read :) ). Now, when I add my menu items I keep getting this error in the Debug window of Visual Studio:

System.Windows.Data Error: 4 : Cannot find source for binding with reference     'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl',  AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null;  target element is 'MenuItem' (Name=''); target property is 'HorizontalContentAlignment'  (type 'HorizontalAlignment')

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')

Those two repeat several times I guess based on the number of MenuItems added. The other odd behavior I have noticed is that, after these errors come up in the debug window, the MenuControl drops down (opens) on its own, just by moving the mouse over it (not clicking on it as normally done). So, I guess one has to do with the other.

Any ideas what is going on?? The MenuControlCode is rather long but if needed, I can post it as well.

Here is the XAML code of the MenuControl. After that, in the code I just use the "PrincipalMenu" and add MenuItems to it as needed:

<UserControl x:Class="EOGMapControl.MainPropertyGUI.MenuControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="41" d:DesignWidth="380">
<UserControl.Resources>
    <SolidColorBrush x:Key="HighlightedBackgroundBrush" Color="#FFDEDEDE" />
    <SolidColorBrush x:Key="MenuBackgroundBrush" Color="White" />
    <SolidColorBrush x:Key="NormalBorderBrush" Color="#FFE5DFDF" />
    <SolidColorBrush x:Key="SolidMenuFontBrush" Color="Black" />
    <SolidColorBrush x:Key="HighlightedText" Color="White" />
    <SolidColorBrush x:Key="menuItemBrush" Color="#FFB7B7B7" />
    <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#FFF" />
    <SolidColorBrush x:Key="SolidBorderBrush" Color="#888" />
    <Style x:Key="{x:Type Menu}" TargetType="{x:Type Menu}">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="Height" Value="25"/>
        <Setter Property="Foreground" Value="{StaticResource SolidMenuFontBrush}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Menu}">
                    <Border
        Background="{StaticResource MenuBackgroundBrush}"
        BorderBrush="{StaticResource MenuBackgroundBrush}"
        BorderThickness="1">
                        <StackPanel ClipToBounds="True" Orientation="Horizontal" IsItemsHost="True"/>
                    </Border>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="{x:Type MenuItem}" TargetType="{x:Type MenuItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type MenuItem}">
                    <Border x:Name="Border"
              Background="{TemplateBinding Background}"
              BorderBrush="{TemplateBinding BorderBrush}"
              BorderThickness="0">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition x:Name="Col0" MinWidth="17" Width="Auto" SharedSizeGroup="MenuItemIconColumnGroup"/>
                                <ColumnDefinition Width="Auto" SharedSizeGroup="MenuTextColumnGroup"/>
                                <ColumnDefinition Width="Auto" SharedSizeGroup="MenuItemIGTColumnGroup"/>
                                <ColumnDefinition x:Name="Col3" Width="14"/>
                            </Grid.ColumnDefinitions>

                            <!-- ContentPresenter to show an Icon if needed -->
                            <ContentPresenter Grid.Column="0" Margin="4,0,6,0" x:Name="Icon" VerticalAlignment="Center" ContentSource="Icon"/>

                            <!-- Glyph is a checkmark if needed for a checkable menu -->
                            <Grid Grid.Column="0" Visibility="Hidden" Margin="4,0,6,0" x:Name="GlyphPanel" VerticalAlignment="Center">
                                <Path x:Name="GlyphPanelpath" VerticalAlignment="Center" Fill="{TemplateBinding Foreground}" Data="M0,2 L0,4.8 L2.5,7.4 L7.1,2.8 L7.1,0 L2.5,4.6 z" FlowDirection="LeftToRight"/>
                            </Grid>

                            <!-- Content for the menu text etc -->
                            <ContentPresenter Grid.Column="1"
                            Margin="{TemplateBinding Padding}"
                            x:Name="HeaderHost"
                            RecognizesAccessKey="True"
                            ContentSource="Header"/>

                            <!-- Content for the menu IGT -->
                            <ContentPresenter Grid.Column="2"
                            Margin="8,1,8,1"
                            x:Name="IGTHost"
                            ContentSource="InputGestureText"
                            VerticalAlignment="Center"/>

                            <!-- Arrow drawn path which points to the next level of the menu -->
                            <Grid Grid.Column="3" Margin="4,0,6,0" x:Name="ArrowPanel" VerticalAlignment="Center">
                                <Path x:Name="ArrowPanelPath" HorizontalAlignment="Right" VerticalAlignment="Center" Fill="{TemplateBinding Foreground}" Data="M0,0 L0,8 L4,4 z"/>
                            </Grid>
                            <!--IsOpen="{Binding Path=IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}"
                            PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}"
                            -->
                            <!-- The Popup is the body of the menu which expands down or across depending on the level of the item -->
                            <Popup  Placement="Right" IsOpen="{TemplateBinding IsSubmenuOpen}" x:Name="SubMenuPopup"  Focusable="false" PopupAnimation="Fade">
                                <Border x:Name="SubMenuBorder" SnapsToDevicePixels="True" Background="{StaticResource WindowBackgroundBrush}"  BorderBrush="{StaticResource SolidBorderBrush}" BorderThickness="1" Padding="2,2,2,2">
                                    <Grid x:Name="SubMenu" Grid.IsSharedSizeScope="True">
                                        <!--StackPanel holds children of the menu. This is set by IsItemsHost=True-->
                                        <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/>
                                        <!--<ScrollViewer CanContentScroll="True">
                                            <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" />
                                        </ScrollViewer>-->
                                    </Grid>
                                </Border>
                            </Popup>
                        </Grid>
                    </Border>

                    <!-- These triggers re-configure the four arrangements of MenuItem to show different levels of menu via Role -->
                    <ControlTemplate.Triggers>

                        <!-- Role = TopLevelItem :  this is a child menu item from the top level without any child items-->
                        <Trigger Property="Role" Value="TopLevelItem">
                            <Setter Property="Padding" Value="6,1,6,1"/>
                            <Setter Property="Visibility" Value="Collapsed" TargetName="ArrowPanel"/>
                        </Trigger>

                        <!-- Role = SubMenuHeader : this is a child menu item which does not have children -->
                        <Trigger Property="Role" Value="SubmenuHeader">
                            <Setter Property="DockPanel.Dock" Value="Top"/>
                            <Setter Property="Padding" Value="0,2,0,2"/>
                        </Trigger>

                        <!-- Role = SubMenuItem : this is a child menu item which has children-->
                        <Trigger Property="Role" Value="SubmenuItem">
                            <Setter Property="DockPanel.Dock" Value="Top"/>
                            <Setter Property="Padding" Value="0,2,0,2"/>
                            <Setter Property="Visibility" Value="Collapsed" TargetName="ArrowPanel"/>
                        </Trigger>

                        <Trigger Property="IsSuspendingPopupAnimation" Value="true">
                            <Setter Property="PopupAnimation" Value="None" TargetName="SubMenuPopup"/>
                        </Trigger>

                        <!-- If no Icon is present the we collapse the Icon Content -->
                        <Trigger Property="Icon" Value="{x:Null}">
                            <Setter Property="Visibility" Value="Collapsed" TargetName="Icon"/>
                        </Trigger>

                        <!-- The GlyphPanel contains the CheckMark -->
                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="Visibility" Value="Visible" TargetName="GlyphPanel"/>
                            <Setter Property="Visibility" Value="Collapsed" TargetName="Icon"/>
                        </Trigger>

                        <!-- Using the system colors for the Menu Highlight and IsEnabled-->
                        <Trigger Property="IsHighlighted" Value="true">
                            <Setter Property="Background" Value="{StaticResource HighlightedBackgroundBrush}" TargetName="Border"/>
                            <Setter Property="Foreground" Value="{StaticResource HighlightedText}"/>
                            <Setter Property="BorderBrush" Value="{StaticResource NormalBorderBrush}" TargetName="Border"/>
                        </Trigger>
                        <Trigger Property="IsHighlighted" Value="false">
                            <Setter Property="Background" Value="{StaticResource MenuBackgroundBrush}" TargetName="Border"/>
                            <Setter Property="Foreground" Value="{StaticResource SolidMenuFontBrush}"/>
                            <Setter Property="BorderBrush" Value="{StaticResource MenuBackgroundBrush}" TargetName="Border"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="LightGray"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<UserControl.Foreground>
    <SolidColorBrush />
</UserControl.Foreground>
<Grid Height="24" Width="250" HorizontalAlignment="Left">
    <Grid.Background>
        <SolidColorBrush />
    </Grid.Background>
    <Menu Name="PrincipalMenu" Margin="0,0,-100,0">
    </Menu>
</Grid>

like image 775
Luis Garcia Avatar asked Apr 17 '13 16:04

Luis Garcia


1 Answers

Kindly refer the below link:

http://www.codeproject.com/Tips/124556/How-to-suppress-the-System-Windows-Data-Error-warn

The solution is, set data binding source switch level as critical in constructor of the class.

public TestSample() //constructor of the class
{
   InitializeComponent();

   System.Diagnostics.PresentationTraceSources.DataBindingSource.Switch.Level =    System.Diagnostics.SourceLevels.Critical;

}
like image 60
ravi Avatar answered Sep 28 '22 02:09

ravi