private void ApplyInternal(IMenu menu, Context context, int id, int order, object dataContext, bool useContext) { PlatformExtensions.ValidateTemplate(ItemsSource, Items); bool isSubMenu = !string.IsNullOrEmpty(ItemsSource) || (Items != null && Items.Count > 0); XmlPropertySetter <MenuItemTemplate, IMenuItem> setter; int groupId; int.TryParse(Group, out groupId); if (isSubMenu) { ISubMenu subMenu = menu.AddSubMenu(groupId, id, order, string.Empty); setter = new XmlPropertySetter <MenuItemTemplate, IMenuItem>(subMenu.Item, context, new BindingSet()); subMenu.SetBindingMemberValue(AttachedMembers.Object.Parent, menu); subMenu.Item.SetBindingMemberValue(AttachedMembers.Object.Parent, subMenu); SetDataContext(subMenu, setter.BindingSet, dataContext, useContext); ApplySelf(subMenu.Item, setter); if (string.IsNullOrEmpty(ItemsSource)) { for (int index = 0; index < Items.Count; index++) { Items[index].Apply(subMenu, context, index, index); } } else { subMenu.SetBindingMemberValue(AttachedMembers.Menu.ItemsSourceGenerator, new MenuItemsSourceGenerator(subMenu, context, ItemTemplate ?? this)); XmlPropertySetter <object, object> .AddBinding(setter.BindingSet, subMenu, AttachedMemberConstants.ItemsSource, ItemsSource, true); } } else { var menuItem = menu.Add(groupId, id, order, string.Empty); setter = new XmlPropertySetter <MenuItemTemplate, IMenuItem>(menuItem, context, new BindingSet()); menuItem.SetBindingMemberValue(AttachedMembers.Object.Parent, menu); SetDataContext(menuItem, setter.BindingSet, dataContext, useContext); ApplySelf(menuItem, setter); } setter.Apply(); }