This is because although MenuItem top-level MenuItem x:Shared="False" , the MenuItem objects in your collection are not. They are declared once in the ArrayList collection, and then reused in each instance of the created MenuItem object.
To make the code work, you need to get WPF to create new instances. One option would be to apply x:Shared="False" to the collection. For instance:
<Window x:Class="WpfApplication.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <collections:ArrayList x:Key="menuItemValues" x:Shared="False"> <MenuItem Header="First"/> <MenuItem Header="Second"/> <MenuItem Header="Third"/> </collections:ArrayList> <MenuItem x:Key="menuItem" x:Shared="False" ItemsSource="{StaticResource menuItemValues}" Header="Shared menu item"/> </Window.Resources> <StackPanel> <Menu HorizontalAlignment="Left" VerticalAlignment="Top"> <StaticResource ResourceKey="menuItem"/> <StaticResource ResourceKey="menuItem"/> </Menu> </StackPanel> </Window>
Of course, given that the elements are simply assigned Header values, you can simply use the default behavior of the MenuItem template by specifying string values ββinstead of MenuItem values. This allows you to reuse the collection itself (which has no reason to be reused):
<Window x:Class="WpfApplication.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:collections="clr-namespace:System.Collections;assembly=mscorlib" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <collections:ArrayList x:Key="menuItemValues"> <s:String>First</s:String> <s:String>Second</s:String> <s:String>Third</s:String> </collections:ArrayList> <MenuItem x:Key="menuItem" x:Shared="False" ItemsSource="{StaticResource menuItemValues}" Header="Shared menu item"/> </Window.Resources> <StackPanel> <Menu HorizontalAlignment="Left" VerticalAlignment="Top"> <StaticResource ResourceKey="menuItem"/> <StaticResource ResourceKey="menuItem"/> </Menu> </StackPanel> </Window>
source share