<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8132362186755867250</id><updated>2011-09-26T14:38:31.984-07:00</updated><category term='Coding'/><category term='C#'/><category term='Misc'/><category term='Prism'/><category term='WPF'/><title type='text'>Dynamic Reconfiguration</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dynamicreconfiguration.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dynamicreconfiguration.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Matt</name><uri>http://www.blogger.com/profile/01164105987665817878</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8132362186755867250.post-7109482411472909230</id><published>2010-12-27T08:32:00.000-08:00</published><updated>2010-12-27T08:32:38.109-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Prism'/><title type='text'>Creating Dynamic Menus in WPF and Prism - Part 4</title><content type='html'>So, &lt;a href="http://dynamicreconfiguration.blogspot.com/2010/12/creating-dynamic-menus-in-wpf-and-prism.html"&gt;last time&lt;/a&gt;&amp;nbsp;I noted that my approach was less than, uhm, optimal.&amp;nbsp; In fact, it was pretty bad.&amp;nbsp; At least it didn't involve &lt;a href="http://dynamicreconfiguration.blogspot.com/2010/09/wpf-prism-and-creating-dynamic-menus_18.html"&gt;convoluted code behind&lt;/a&gt;!&amp;nbsp; Anyway.&lt;br /&gt;&lt;br /&gt;So, I'd like to have a nice, dynamic menu or toolbar (yup, either or both) that Prism modules can add items to.&amp;nbsp; It'd be nice if they could place those items where they need them, such that the menus are still ordered in a useful manner for the user.&amp;nbsp; It'd also be nice if a module could add an item that was always displayed, versus an item that is only displayed when a view in the module is active.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Whew.&lt;br /&gt;&lt;br /&gt;Spec the code.&amp;nbsp; Design the code.&amp;nbsp; Implement the code.&amp;nbsp; (Okay, so I didn't do that completely, and I paid for it.&amp;nbsp; But let's pretend that I practice what I preach...)&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The menu / toolbar service should not be tied to its view.&amp;nbsp; That is, items added should be able to be displayed in a menu, toolbar, "ribbon", or some hybrid thereof.&lt;/li&gt;&lt;li&gt;Modules should be able to differentiate between the various types however - I should know if I'm adding an item to a menu or a toolbar.&lt;/li&gt;&lt;li&gt;Modules should be able to specify whether an item has a parent (which can be any previously added item), and place the item relative to some other child of that parent.&lt;/li&gt;&lt;li&gt;Modules should be able to add a seperator.&lt;/li&gt;&lt;li&gt;Items that are added can be either permanent (always shown), or tied to the activity of the module.&lt;/li&gt;&lt;/ol&gt;Design decisions time!&lt;br /&gt;&lt;br /&gt;You'll note that I already defined that the dynamic menu / toolbar thingy should be a service - based on the shellacking of my previous attempt, its become pretty obvious that this thing should be a service interface in the Prism project's Infrastructure DLL.&amp;nbsp; I didn't list that in the requirements, but it probably should be.&lt;br /&gt;&lt;br /&gt;The first requirement should be pretty easy to meet - the service can expose an ObservableCollection of items, and the various UI elements can use a HierarchicalDataTemplate to format the collection.&amp;nbsp; This does mean that I'll probably need multiple implementations of the service however (requirement #2) - that shouldn't be a problem however using &lt;a href="http://msdn.microsoft.com/en-us/library/ff664762(v=pandp.50).aspx"&gt;Unity's Resolve&lt;t&gt;(string name)&lt;/a&gt;&amp;nbsp;overload.&lt;br /&gt;&lt;br /&gt;Requirement three means that each item will have to have children items, and the service should:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;expose a way to add an item that optionally includes a parent and a predecessor&lt;/li&gt;&lt;li&gt;expose an IEnumerable&amp;lt;&amp;gt; of items, so that modules can query for parents / predecessors&lt;/li&gt;&lt;li&gt;(maybe?) expose a way to query for items, since the hierarchical nature of the data means queries will have to be recursive (and writing recursive LINQ operators everywhere would kinda suck)&lt;/li&gt;&lt;/ul&gt;Requirement four: items can be just a separator.&amp;nbsp; Boolean field for the win!&lt;br /&gt;&lt;br /&gt;Requirement five is tricky.&amp;nbsp; There's a couple of ways Prism handles what is viewed / active:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;IActiveAware.&amp;nbsp; Views can implement this interface, which gives you a boolean field indicating whether or not the view is active, and an event that can be subscribed to when that field changes.&amp;nbsp; This is tied to a Region's concept of what is active.&amp;nbsp; If we allow&amp;nbsp;modules to provide an IActiveAware object, a menu item could be tied to that, and we could show / hide a menu item based on that object.&lt;/li&gt;&lt;li&gt;The service could implement INavigationAware.&amp;nbsp; This would give us notification when a navigation request is made to some object.&amp;nbsp; I'm not sure what happens if we register an object that is INavigationAware that is not designed to handle a navigation URI request - in essence, we want our service to snoop navigation, not actually perform in it.&lt;/li&gt;&lt;li&gt;A PresentationEvent, that modules can fire when they want their items shown or hidden.&lt;/li&gt;&lt;/ol&gt;Option #1 provides a lot of granularity, as each View can have menu items added / removed.&amp;nbsp; On the other hand, it may provide too much granularity, and we may find ourselves adding / removing items when we don't want to.&amp;nbsp; We'd have to be careful as to what object implementing IActiveAware is sent to the service.&lt;br /&gt;&lt;br /&gt;Option #2 feels a little fishy.&amp;nbsp; While it seems ideal, I don't like our service being a navigation object when it isn't; that, and at least two of the methods (OnNavigatedTo and OnNavigatedFrom) would never be called.&amp;nbsp; Implmenting half of interfaces always feels a little bad, so I'm inclined not to pick that route.&lt;br /&gt;&lt;br /&gt;Option #3 gives the most granularity, but also requires more out of the users of the service.&amp;nbsp; I want this to be as "fire and forget" as possible - I put in my menu items, and I move on.&lt;br /&gt;&lt;br /&gt;So, I'm probably going to go with Option #1.&lt;br /&gt;&lt;br /&gt;Lots of design decisions made, with a lot of tradeoffs.&amp;nbsp; Next time: more design decisions, and some initial implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8132362186755867250-7109482411472909230?l=dynamicreconfiguration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicreconfiguration.blogspot.com/feeds/7109482411472909230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/12/creating-dynamic-menus-in-wpf-and-prism_27.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/7109482411472909230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/7109482411472909230'/><link rel='alternate' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/12/creating-dynamic-menus-in-wpf-and-prism_27.html' title='Creating Dynamic Menus in WPF and Prism - Part 4'/><author><name>Matt</name><uri>http://www.blogger.com/profile/01164105987665817878</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8132362186755867250.post-595060909015325767</id><published>2010-12-25T17:25:00.000-08:00</published><updated>2010-12-27T08:32:58.674-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Prism'/><title type='text'>Creating Dynamic Menus in WPF and Prism - Part 3</title><content type='html'>This may be the topic that won't die.&amp;nbsp; After the train wreck that was my first attempt at creating a dynamic menu in WPF / Prism (see the past two blog posts, plus my &lt;a href="http://stackoverflow.com/questions/3723580/how-to-dynamically-add-menuitems-with-a-header-to-a-wpf-menu"&gt;question on StackOverflow&lt;/a&gt;), I ended up getting a pretty nice dynamic menu working using what Robert Rossney suggested (again, see that post on StackOverflow...).&amp;nbsp; My approach generally followed the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The menu (or pseudo-toolbar) was implemented in its own Prism Module.&amp;nbsp; Other modules obtained the service by referencing the module, and could add menu items by accessing the service.&lt;/li&gt;&lt;li&gt;Menu items were added&amp;nbsp;by specifying a command, menu name, a reference to an image to display, and optionally, a parent menu item.&lt;/li&gt;&lt;/ol&gt;The meat of this approach is below.&amp;nbsp; A ViewModel contains an ObservableCollection of ToolbarItems, while a View interprets those items as a menu.&amp;nbsp; The toolbar service exposes a method AddMenu that modules can call to add their items:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Add a menu item to the toolbar&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;public void AddMenu(Action&amp;lt;object&amp;gt;callbackFunction, string menuName, string iconLocation, string parentMenu)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (String.IsNullOrEmpty(menuName))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new ArgumentNullException("menuName");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (ExistingMenuNames.Contains&amp;lt;String&amp;gt;(menuName))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new InvalidOperationException("Cannot add a menu item with the same name as an existing menu item");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ToolbarObject newObject = new ToolbarObject(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;menuName,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iconLocation,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new CompositeCommand());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add a command, if available&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (callbackFunction != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newObject.Command.RegisterCommand(new DelegateCommand&amp;lt;Object&amp;gt;(callbackFunction));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Set up the parent menu, if available&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!String.IsNullOrEmpty(parentMenu))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!ExistingMenuNames.Contains&amp;lt;String&amp;gt;(parentMenu))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new InvalidOperationException("Cannot add a menu to a parent menu item that doesn't exist");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (_model == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_model = _container.Resolve&amp;lt;IToolBarPresentationModel&amp;gt;();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var parent = (from item in _model.ToolbarItems&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;where String.Equals(item.Name, parentMenu, StringComparison.InvariantCulture)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select item).Single&amp;lt;ToolbarObject&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parent.Children.Add(newObject);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Insert after Main, keeping Help last&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_model.ToolbarItems.Insert(1, newObject);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The big issue I had run into before was actually displaying the items in the View appropriately. Enter the wonderful &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.hierarchicaldatatemplate.aspx"&gt;HierarchicalDataTemplate&lt;/a&gt;, and its little (very necessary) cousin, &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemcontainerstyle.aspx"&gt;ItemContainerStyle&lt;/a&gt;. The view code using these two is below.&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;UserControl.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;model:ToolBarPresentationModel x:Key="modelData" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Style TargetType="MenuItem"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Setter Property="Command" Value="{Binding Path=Command}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Setter Property="Foreground" Value="White"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;HierarchicalDataTemplate DataType="{x:Type model:ToolbarObject}"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemsSource="{Binding Path=Children}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;HierarchicalDataTemplate.ItemContainerStyle&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Style TargetType="MenuItem"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Setter Property="Command" Value="{Binding Path=Command}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/HierarchicalDataTemplate.ItemContainerStyle&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;StackPanel VerticalAlignment="Top" Margin="5,0,5,0"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Image Height="24" VerticalAlignment="Center" Source="{Binding Path=ImageLocation}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ContentPresenter Content="{Binding Path=Name}" HorizontalAlignment="Center"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/HierarchicalDataTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/UserControl.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;UserControl.DataContext&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Binding Source="{StaticResource modelData}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/UserControl.DataContext&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Grid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Menu Height="48" Margin="5,0,5,0" Name="MainMenu" VerticalAlignment="Top" Background="Transparent"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ItemsSource="{Binding}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Menu&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Grid&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This code creates a menu where each menu item in the parent menu can have children, or be a clickable menu item itself.&amp;nbsp; Each menu item provides its own path to a resource, such that each menu item shows an image and a text description.&amp;nbsp; Due to the limited nature of the application, the first menu is always kept as Main (or File), while the last is always kept as Help.&lt;br /&gt;&lt;br /&gt;While this approach worked great for the application at hand, its not very useful for a general application.&amp;nbsp; To whit, the following are some of the obvious drawbacks:&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;First come, first served.&amp;nbsp; If Module A adds an item to the menu without a parent, that will get placed after Main.&amp;nbsp; If Module B does the same, then it will get added after Main, pushing Module A's menu further down the line.&amp;nbsp; This may not be desireable.&lt;/li&gt;&lt;li&gt;Nesting of menus only goes down one level.&amp;nbsp; If you specify a parent that is not in the first row of the menu, the parent won't be found.&lt;/li&gt;&lt;li&gt;Specifying an Action as the parameter only gives us a callback, and doesn't allow multiple modules to tie a callback to a single menu option.&amp;nbsp; This works fine if a menu option should only be handled by a single module, but works poorly if a number of modules need to respond to a menu click, e.g., Save or Exit.&lt;/li&gt;&lt;li&gt;Menu options that are added under a parent are added on a first come, first served basis.&amp;nbsp; This can lead to some odd and confusing orderings, depending on the Module loading.&lt;/li&gt;&lt;li&gt;No separators.&amp;nbsp; Ugh.&lt;/li&gt;&lt;li&gt;The toolbar service module should not have to be referenced directly by other modules.&lt;/li&gt;&lt;li&gt;Does everything really need an image?&amp;nbsp; This approach was supposed to emulate (to a very, very limited extent) a Ribbon-style control, combining both menu / toolbar approaches.&amp;nbsp; While kind of fun and quirky, its not appropriate for a typical line of business application.&lt;/li&gt;&lt;/ol&gt;Okay, so this approach kind of, well, sucks.&amp;nbsp; But we learn from our mistakes.&amp;nbsp; Next time: doing it better, part 1!&amp;nbsp; (Or is it Part 4?)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Edit&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Also: Merry Christmas!&amp;nbsp; The fact that I'm interested in writing about code again may be an "end of the year" thing, but I'll see where it takes me for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8132362186755867250-595060909015325767?l=dynamicreconfiguration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicreconfiguration.blogspot.com/feeds/595060909015325767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/12/creating-dynamic-menus-in-wpf-and-prism.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/595060909015325767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/595060909015325767'/><link rel='alternate' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/12/creating-dynamic-menus-in-wpf-and-prism.html' title='Creating Dynamic Menus in WPF and Prism - Part 3'/><author><name>Matt</name><uri>http://www.blogger.com/profile/01164105987665817878</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8132362186755867250.post-8193252459001437656</id><published>2010-09-18T19:00:00.000-07:00</published><updated>2010-12-27T08:33:09.069-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Prism'/><title type='text'>WPF, Prism, and Creating Dynamic Menus - Part 2</title><content type='html'>Continuing my post from last time...&lt;br /&gt;&lt;br /&gt;So my question on StackOverflow ended up getting a great &lt;a href="http://stackoverflow.com/questions/3723580/how-to-programmatically-create-menuitems-with-a-header-in-a-dynamic-menu/3729778#3729778"&gt;answer&lt;/a&gt; that worked perfectly.&amp;nbsp; Where did I go wrong? &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I listened to advice on teh internets (and I'm still learning WPF, which, if I knew it better, would have precluded me from going down this wonky path at all).&amp;nbsp; The "path" I ended up going down had a dynamic menu being created in a HierarchicalDataTemplate (good), but the actual content of the menu being generated in a load event in the code-behind (bad).&lt;/div&gt;&lt;br /&gt;It's not that I'm against code in the code-behind.&amp;nbsp; I think there are times where it does make sense - take click event handlers in a ListView, for example.&amp;nbsp; There isn't a great way to route that through an ICommand object, at least that I'm aware of.&amp;nbsp; Often you aren't going to really &lt;strong&gt;do&lt;/strong&gt; anything in the click handler - you just need to pass it back to the PresentationModel / ViewModel, which has all the logic to do the action of the click anyway.&amp;nbsp; You just need to &lt;em&gt;handle&lt;/em&gt; the click.&amp;nbsp; And, unlike a menu, toolbar, or other button, you probably have a one-to-one relationship between the click handler and the method in PM/VM that will handle the action (so the benefit of an ICommand object is lessened somewhat).&amp;nbsp; Anyway.&lt;br /&gt;&lt;br /&gt;That rant over, I pretty much knew I was hosing myself when I had written this blob of code:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;private void ContentPresenter_Loaded(object sender, System.Windows.RoutedEventArgs e)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; ContentPresenter presenter = sender as ContentPresenter;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; if (sender != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DependencyObject parentObject = VisualTreeHelper.GetParent(presenter);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool bContinue = true;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (bContinue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || parentObject == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (parentObject is MenuItem)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bContinue = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentObject = VisualTreeHelper.GetParent(parentObject);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var menuItem = parentObject as MenuItem;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (menuItem != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ToolbarObject toolbarObject = menuItem.DataContext as ToolbarObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StackPanel panel = new StackPanel();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!String.IsNullOrEmpty(toolbarObject.ImageLocation))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Image image = new Image();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image.Height = 24;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image.VerticalAlignment = System.Windows.VerticalAlignment.Center;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Binding sourceBinding = new Binding("ImageLocation");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceBinding.Mode = BindingMode.TwoWay;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sourceBinding.Source = toolbarObject;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; image.SetBinding(Image.SourceProperty, sourceBinding);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; panel.Children.Add(image);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContentPresenter contentPresenter = new ContentPresenter();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Binding contentBinding = new Binding("Name");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentBinding.Mode = BindingMode.TwoWay;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contentBinding.Source = toolbarObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contentPresenter.SetBinding(ContentPresenter.ContentProperty,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contentBinding);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;panel.Children.Add(contentPresenter);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; menuItem.Header = panel;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Binding commandBinding = new Binding("Command");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commandBinding.Mode = BindingMode.TwoWay;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; commandBinding.Source = toolbarObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; menuItem.SetBinding(MenuItem.CommandProperty, commandBinding); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Yeah, that's no good at all. The end result of this was a "blank" menu, where the non-rendered items were clickable, but no rendering was done on the StackPanel embedded in the MenuItem's Header. Close, but no cigar.&lt;br /&gt;&lt;br /&gt;Luckily, you can handle this pretty easily using the ItemContainerStyle property of a HierarchicalDataTemplate.&amp;nbsp; (I added the additional Style directive to handle the case where the command needs to occur on an item in the first row of the Menu) &lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;UserControl.Resources&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;model:RecapToolBarPresentationModel x:Key="modelData" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Style TargetType="MenuItem"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Command" Value="{Binding Path=Command}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;HierarchicalDataTemplate DataType="{x:Type model:ToolbarObject}"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemsSource="{Binding Path=Children}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;HierarchicalDataTemplate.ItemContainerStyle&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style TargetType="MenuItem"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Command" Value="{Binding Path=Command}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/HierarchicalDataTemplate.ItemContainerStyle&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StackPanel VerticalAlignment="Top" Margin="5,0,5,0"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Image Height="24" VerticalAlignment="Center" Source="{Binding&amp;nbsp;Path=ImageLocation}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ContentPresenter Content="{Binding Path=Name}" HorizontalAlignment="Center"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/HierarchicalDataTemplate&amp;gt;&lt;br /&gt;&amp;lt;/UserControl.Resources&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lessons Learned:&lt;/strong&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I've got a lot to learn in WPF still.&amp;nbsp; Knowing enough to get some basic ListViews displayed (and enough to get Prism more or less working for me) is great and all, but the more complex DataTemplating is still a learning ground.&amp;nbsp; Good stuff though - the power of WPF when compared against WinForms (or worse, MFC) is simply astounding.&lt;/li&gt;&lt;li&gt;Watch out for advice coming teh internets.&amp;nbsp; StackOverflow's ratings really do provide a nice level of confidence on the advice you get (which, incidentally, you certainly aren't getting by reading this blog)&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8132362186755867250-8193252459001437656?l=dynamicreconfiguration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicreconfiguration.blogspot.com/feeds/8193252459001437656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/09/wpf-prism-and-creating-dynamic-menus_18.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/8193252459001437656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/8193252459001437656'/><link rel='alternate' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/09/wpf-prism-and-creating-dynamic-menus_18.html' title='WPF, Prism, and Creating Dynamic Menus - Part 2'/><author><name>Matt</name><uri>http://www.blogger.com/profile/01164105987665817878</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8132362186755867250.post-8040034400505335686</id><published>2010-09-17T10:52:00.000-07:00</published><updated>2010-12-27T08:33:21.974-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='Prism'/><title type='text'>WPF, Prism, and Creating Dynamic Menus</title><content type='html'>This blog post originated from a question on StackOverflow &lt;a href="http://stackoverflow.com/questions/3723580/how-to-programmatically-set-menuitem-header-in-a-dynamic-menu"&gt;How to programmatically set MenuItem.Header in a dynamic menu&lt;/a&gt;&amp;nbsp;that I asked.&amp;nbsp; The first (and currently, only) person responding to the question implied that they weren't sure how I ended up where I did.&amp;nbsp; In order to clarify, I decided to write up this post (first one in what, a year?)&lt;br /&gt;&lt;br /&gt;I've been working for sometime now on an application that utilizes WPF and Prism. Originally, the application had a static menu hosted in a seperate module - when the user clicked an item in the menu, static CompositeCommand objects would route command data back to a presentation model where DelegateCommands would handle the events.&amp;nbsp; This was an easy thing to knock together, as shown below.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Original&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;PresentationModel&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The original code behind the PresentationModel (or ViewModel - I started off with PresentationModel, even though VM is probably a better way of stating it - for consistency's sake, I'm going to stick with PM):&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;public interface IToolBarPresentationModel&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// View associated with this model&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IToolBarView View { get; set; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;internal sealed class ToolBarPresentationModel : IToolBarPresentationModel&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private readonly IUnityContainer _container;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private readonly IEventAggregator _eventAggregator;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public DelegateCommand&amp;lt;object&amp;gt; FileExitCommand { get; set; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public DelegateCommand&amp;lt;object&amp;gt; HelpCommand { get; set; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// Default constructor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;param name="container"&amp;gt;The unity container&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;exception cref="ArgumentNullException"&amp;gt;Thrown if the container is null&amp;lt;/exception&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public ToolBarPresentationModel(IUnityContainer container, IEventAggregator eventAggregator)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (container == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw new ArgumentNullException("container", "The IUnityContainer cannot be null");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (eventAggregator == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new ArgumentNullException("eventAggregator",&amp;nbsp;"The IEventAggregator cannot be null");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_container = container;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_eventAggregator = eventAggregator;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;View = _container.Resolve&amp;lt;IToolBarView&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;View.Model = this;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileExitCommand = new DelegateCommand&amp;lt;object&amp;gt;(new Action&amp;lt;object&amp;gt;(OnFileExit));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HelpCommand = new DelegateCommand&amp;lt;object&amp;gt;(new Action&amp;lt;object&amp;gt;(OnHelp));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ToolBarCommands.FileExit.RegisterCommand(this.FileExitCommand);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ToolBarCommands.Help.RegisterCommand(this.HelpCommand);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private void OnFileExit(Object obj)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Application.Current.Shutdown(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;private void OnHelp(Object obj)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var presentationModel = _container.Resolve&amp;lt;IHelpPresentationModel&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Notify that the help view should be shown&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_eventAggregator.GetEvent&amp;lt;ChangeViewEvent&amp;gt;().Publish(new ChangeViewEventArguments(ViewName.HelpView));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#region IToolBarPresentationModel Members&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Modules.ToolBar.Views.IToolBarView View&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#endregion&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;This is fairly straight-forward. We have two commands - File-&amp;gt;Exit and Help, each of which have a static CompositeCommand that we add our DelegateCommand objects to. The Action targets exit the application, and call an event that forces the Help view to be displayed.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;View&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The original code behind simply implemented the View's interface:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public interface IToolBarView&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// The model associated with this view&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IToolBarPresentationModel Model { get; set; }&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The XAML was almost equally vanilla - except for one small detail that ended up being the crux of the problem:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;UserControl x:Class="Modules.ToolBar.Views.ToolBarView"&lt;br /&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt;xmlns:model="clr-namespace:Modules.ToolBar.PresentationModels"&lt;br /&gt;xmlns:local="clr-namespace:Modules.ToolBar"&amp;gt;&lt;br /&gt;&amp;lt;Grid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Menu Height="48" Margin="5,0,5,0" Name="MainMenu" VerticalAlignment="Top" Background="Transparent"&lt;br /&gt;ItemsSource="{Binding}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MenuItem Name="MenuFile" AutomationProperties.AutomationId="File"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MenuItem.Header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Image Height="24" VerticalAlignment="Center" Source="../Resources/066.png"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ContentPresenter Content="Main"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MenuItem.Header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MenuItem AutomationProperties.AutomationId="FileExit" Command="{x:Static local:ToolBarCommands.FileExit}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MenuItem.Header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Image Height="24" VerticalAlignment="Center" Source="../Resources/002.png"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ContentPresenter Content="Exit"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MenuItem.Header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MenuItem&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MenuItem&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MenuItem Name="MenuHelp" AutomationProperties.AutomationId="Help" Command="{x:Static local:ToolBarCommands.Help}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;MenuItem.Header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Image Height="24" VerticalAlignment="Center" Source="../Resources/152.png"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ContentPresenter Content="Help"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MenuItem.Header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/MenuItem&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Menu&amp;gt;&lt;br /&gt;&amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/UserControl&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The part of this XAML layout of the menu that I liked in the first cut was the appearance of each &amp;lt;MenuItem&amp;gt; - the &amp;lt;StackPanel&amp;gt; surrounding the &amp;lt;Image&amp;gt; and &amp;lt;ContentPresenter&amp;gt; lays out content such that it has sort of a "poor man's Ribbon" look and feel to it.&lt;br /&gt;&lt;br /&gt;So: the goal is to keep the original look and feel of the menu, while updating it with the capability to have other modules add items to the menu.&amp;nbsp; The first cut!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Attempt One&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So the first attempt had me adding a new model class that would represent a single item in the menu, called ToolbarObject - shown below.&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Represents an object on the toolbar&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;br /&gt;public sealed class ToolbarObject : INotifyPropertyChanged&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; public ToolbarObject() : this(String.Empty, String.Empty, null)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; public ToolbarObject(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String imageLocation,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CompositeCommand command)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _name = name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _imageLocation = imageLocation;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _command = command;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Children = new ObservableCollection&lt;toolbarobject&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; private String _name;&lt;br /&gt;&amp;nbsp;&amp;nbsp; public String Name&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _name; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _name = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NotifyPropertyChanged("Name");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; private string _imageLocation;&lt;br /&gt;&amp;nbsp;&amp;nbsp; public String ImageLocation&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _imageLocation;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _imageLocation = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NotifyPropertyChanged("ImageLocation");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; private CompositeCommand _command;&lt;br /&gt;&amp;nbsp;&amp;nbsp; public CompositeCommand Command&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _command;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _command = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NotifyPropertyChanged("Command");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; private ObservableCollection&lt;toolbarobject&gt; _children;&lt;br /&gt;&amp;nbsp;&amp;nbsp; public ObservableCollection&lt;toolbarobject&gt; Children&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _children;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _children = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; #region INotifyPropertyChanged Members&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public event PropertyChangedEventHandler PropertyChanged;&lt;br /&gt;&amp;nbsp;&amp;nbsp; #endregion&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; private void NotifyPropertyChanged(String name)&lt;br /&gt;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PropertyChangedEventHandler handler = PropertyChanged;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!String.IsNullOrEmpty(name)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;&amp;amp; handler != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; handler(this, new PropertyChangedEventArgs(name));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Since I now have an object representing the menu, the PresentationModel was updated with an ObservableCollection of ToolbarItems - shown in the following (just showing the interface, as the implementation doesn't need explanation):&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;public interface IToolBarPresentationModel&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// View associated with this model&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;br /&gt;IToolBarView View { get; set; }&lt;br /&gt;&lt;br /&gt;ObservableCollection&amp;lt;ToolbarObject&amp;gt; ToolbarItems { get; set; }&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The view was updated to use a hierarchical data template, and the menu was bound to the data template and the new observable collection:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&amp;lt;UserControl x:Class="Modules.ToolBar.Views.ToolBarView"&lt;br /&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt;xmlns:model="clr-namespace:Modules.ToolBar.PresentationModels"&lt;br /&gt;xmlns:local="clr-namespace:Modules.ToolBar"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;UserControl.Resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;model:ToolBarPresentationModel x:Key="modelData" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;HierarchicalDataTemplate DataType="{x:Type model:ToolbarObject}"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ItemsSource="{Binding Path=Children}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;MenuItem Command="{Binding Path=Command}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;MenuItem.Header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Image Height="24" VerticalAlignment="Center" Source="{Binding Path=ImageLocation}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ContentPresenter Content="{Binding Path=Name}"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/MenuItem.Header&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/MenuItem&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/HierarchicalDataTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/UserControl.Resources&amp;gt;&lt;br /&gt;&amp;lt;UserControl.DataContext&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Binding Source="{StaticResource modelData}"/&amp;gt;&lt;br /&gt;&amp;lt;/UserControl.DataContext&amp;gt;&lt;br /&gt;&amp;lt;Grid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Menu Height="48" Margin="5,0,5,0" Name="MainMenu" VerticalAlignment="Top" Background="Transparent"&lt;br /&gt;ItemsSource="{Binding}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/Menu&amp;gt;&lt;br /&gt;&amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;lt;/UserControl&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This does a great job of rendering the first row in the menu - however, although the command routing works, the images are shown for the first items in the menu, any subitems aren't shown. Clicking on "File", for example, wouldn't collapse any submenu. In researching this, I came across two articles:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://utahdnug.org/blogs/xamlcoder/archive/2008/11/25/building-a-databound-wpf-menu-using-a-hierarchicaldatatemplate.aspx"&gt;Building a Databound WPF Menu using a HierarchicalDataTemplate&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://karlshifflett.wordpress.com/2008/02/03/wpf-sample-series-databound-hierarchicaldatatemplate-menu-sample/"&gt;WPF Sample Series - DataBound HierarchicalDataTemplate Menu Sample&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In these examples, the code behind is responsible (in a load event) for constructing the hiearchy in the menu and ensuring that everything gets bound together correctly.&amp;nbsp; When this is just a menu, this works great - however, the moment you try to place the &amp;lt;StackPanel&amp;gt; into the &amp;lt;MenuItem.Header&amp;gt;, the whole thing doesn't get rendered (it is clickable, however).&amp;nbsp; The question on StackOverflow thus became the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Admittedly, there is a "code-smell" in using the code-behind to construct what should just be a HierarchicalDataTemplate.&amp;nbsp; Is there a way to do this that doesn't involve the load event?&lt;/li&gt;&lt;li&gt;If not, then how can you get the rendering of items placed into a MenuItem's Header to work?&amp;nbsp; What is preventing them from being drawn?&lt;/li&gt;&lt;/ol&gt;When I get more of a conclusion, I'll update this with the version that uses the advice in the menus and the actual solution (I'm confident there is a way to do this that isn't too ugly).&amp;nbsp; For now, the XAML and code-behind showing my version of the menu construction in the load event is available on the StackOverflow question &lt;a href="http://stackoverflow.com/questions/3723580/how-to-programmatically-set-menuitem-header-in-a-dynamic-menu"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8132362186755867250-8040034400505335686?l=dynamicreconfiguration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicreconfiguration.blogspot.com/feeds/8040034400505335686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/09/wpf-prism-and-creating-dynamic-menus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/8040034400505335686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/8040034400505335686'/><link rel='alternate' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/09/wpf-prism-and-creating-dynamic-menus.html' title='WPF, Prism, and Creating Dynamic Menus'/><author><name>Matt</name><uri>http://www.blogger.com/profile/01164105987665817878</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8132362186755867250.post-1981820093589767856</id><published>2010-01-17T18:59:00.000-08:00</published><updated>2010-07-13T11:50:49.681-07:00</updated><title type='text'></title><content type='html'>Test 1 ... 2&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;public class Something&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;private int _nSomethingElse;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public Something()&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public int SomethingElse&lt;br /&gt;&amp;nbsp;&amp;nbsp;{  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get { return _nSomethingElse; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;set { _nSomethingElse = value; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8132362186755867250-1981820093589767856?l=dynamicreconfiguration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicreconfiguration.blogspot.com/feeds/1981820093589767856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/01/test-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/1981820093589767856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/1981820093589767856'/><link rel='alternate' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2010/01/test-1.html' title=''/><author><name>Matt</name><uri>http://www.blogger.com/profile/01164105987665817878</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8132362186755867250.post-1030092378185579408</id><published>2009-01-07T10:25:00.000-08:00</published><updated>2010-07-13T11:57:11.642-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Order of Operations and the Undefined Behavior</title><content type='html'>Recently I came across a topic on &lt;a href="http://stackoverflow.com/questions/340282/c-mystery#340305"&gt;Stack Overflow&lt;/a&gt; that intrigued me. The question was thus:&lt;br /&gt;&lt;blockquote&gt;Can someone explain to me why this code prints 14? I was just asked by another student and couldn't figure it out.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int i = 5;&lt;br /&gt;i = ++i + ++i;&lt;br /&gt;cout &amp;lt;&amp;lt; i;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;As it turns out, the equation&lt;br /&gt;&lt;code class="prettyprint"&gt;i = ++i + ++i;&lt;/code&gt;&lt;br /&gt;is undefined in the C / C++ standard. The issue boils down to one of expression evaluation. If we look at just &lt;code&gt;i = i++;&lt;/code&gt;, and if &lt;code&gt;i++;&lt;/code&gt; is interpreted as &lt;code&gt;i = i + 1;&lt;/code&gt;, then what is &lt;code&gt;i = i = i + 1&lt;/code&gt;? What takes precedence in the assignment and the evaluation? Not too surprisingly, the creators of C / C++ simply resolved the issue with an "undefined" - the ISO equivalent of a punt. See &lt;a href="http://www.research.att.com/~bs/bs_faq2.html#evaluation-order"&gt;Stroustrup's Explanation&lt;/a&gt; or the &lt;a href="http://www.research.att.com/~bs/bs_faq2.html#evaluation-order"&gt;C++ Standard&lt;/a&gt; itself for more explanation. (Note that as Stroustrup points out, C++ more or less inherited this behavior from C).&lt;br /&gt;&lt;br /&gt;But this made me curious: if C++ has this behavior as undefined, how does C# handle this same problem?&lt;br /&gt;&lt;br /&gt;Let's look at a very simple case that is allowed by the C# compiler:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int i = 1;&lt;br /&gt;i = (++i) + (++i);&lt;br /&gt;System.Console.WriteLine(i);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Knowing that the above code my be undefined (which, by the way, I need to read the C# standard and find out if it really is undefined or not), I would anticipate that the output would be either 5 or 6. Let's look at both.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario 1:&lt;/span&gt;&lt;br /&gt;If it is 5, we would have a sequence similar to this:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;i = (i++) + (2);&lt;br /&gt;i = (3) + (2);&lt;br /&gt;i = 5;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The above seems to assume that a temporary variable is used for either the pre- or post-increment operator, and then an addition is performed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scenario 2:&lt;/span&gt;&lt;br /&gt;If, however, the output is 6, we would have a sequence similar to this:&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;i = (i++) + (2);&lt;br /&gt;i = (3) + (3);&lt;br /&gt;i = 6;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In this case, &lt;code&gt;i&lt;/code&gt; is assigned to a value of 3 after the pre-increment operator, and the addition becomes &lt;code&gt;i + i&lt;/code&gt; (as opposed to &lt;code&gt;i + (prev)i&lt;/code&gt;, as it was for an output of 5).&lt;br /&gt;&lt;br /&gt;Running the above code in C# however will output 5. It looks like Scenario 1 is the winner - but what happened?&lt;br /&gt;&lt;br /&gt;To answer this, we can look at the IL generated for that snippet of code:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int i = 1;&lt;br /&gt;000000ff  mov         dword ptr [ebp-4Ch],1&lt;br /&gt;i = (++i) + (++i);&lt;br /&gt;00000106  inc         dword ptr [ebp-4Ch]&lt;br /&gt;00000109  mov         esi,dword ptr [ebp-4Ch]&lt;br /&gt;0000010c  inc         dword ptr [ebp-4Ch]&lt;br /&gt;0000010f  add         dword ptr [ebp-4Ch],esi&lt;br /&gt;System.Console.WriteLine(i);&lt;br /&gt;00000112  mov         ecx,dword ptr [ebp-4Ch]&lt;br /&gt;00000115  call        747E2EA0&lt;br /&gt;0000011a  nop&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We store the original value in &lt;code&gt;ebp&lt;/code&gt;. We then increment the value, and store it in &lt;code&gt;esi&lt;/code&gt;. We then increment the value in &lt;code&gt;ebp&lt;/code&gt; again, then add it to the value in &lt;code&gt;esi&lt;/code&gt;. Note that while Scenario 1 here is the winner, the user on Stack Overflow got a result consistent with Scenario 2 with their C++ compiler... interesting!&lt;br /&gt;&lt;br /&gt;Even more interesting is what we get if we use post-increment operators in the statement - that being 3.&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int i = 1;&lt;br /&gt;000000ff  mov         dword ptr [ebp-4Ch],1&lt;br /&gt;i = i++ + i++;&lt;br /&gt;00000106  mov         edi,dword ptr [ebp-4Ch]&lt;br /&gt;00000109  inc         dword ptr [ebp-4Ch]&lt;br /&gt;0000010c  mov         esi,dword ptr [ebp-4Ch]&lt;br /&gt;0000010f  inc         dword ptr [ebp-4Ch]&lt;br /&gt;00000112  add         edi,esi&lt;br /&gt;00000114  mov         dword ptr [ebp-4Ch],edi&lt;br /&gt;System.Console.WriteLine(i);&lt;br /&gt;00000117  mov         ecx,dword ptr [ebp-4Ch]&lt;br /&gt;0000011a  call        747E2EA0&lt;br /&gt;0000011f  nop&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here we store the value initially in &lt;code&gt;ebp&lt;/code&gt;. We then store it in &lt;code&gt;edi&lt;/code&gt;, and increment &lt;code&gt;ebp&lt;/code&gt;. We move that value (2) to &lt;code&gt;esi&lt;/code&gt;, and increment &lt;code&gt;ebp&lt;/code&gt; again (3). We then add &lt;code&gt;edi&lt;/code&gt; and &lt;code&gt;esi&lt;/code&gt; together - and get 3. We then move &lt;code&gt;edi&lt;/code&gt; to &lt;code&gt;ebp&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Looking at the &lt;a href="http://msdn.microsoft.com/en-us/library/6a71f45d.aspx"&gt;order of precedence&lt;/a&gt; in C# for the post-increment operator, it does make sense that the post-increment occurs prior to the addition - what is interesting is that the addition doesn't use both increments, but rather the original value of &lt;code&gt;i&lt;/code&gt; (1) and the first post-increment result stored in &lt;code&gt;esi&lt;/code&gt;. Odd.&lt;br /&gt;&lt;br /&gt;Let's look at what happens if we use a mix of pre- and post-increment operators:&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int i = 1;&lt;br /&gt;000000ff  mov         dword ptr [ebp-4Ch],1&lt;br /&gt;i = (i++) + (++i);&lt;br /&gt;00000106  mov         esi,dword ptr [ebp-4Ch]&lt;br /&gt;00000109  inc         dword ptr [ebp-4Ch]&lt;br /&gt;0000010c  inc         dword ptr [ebp-4Ch]&lt;br /&gt;0000010f  add         dword ptr [ebp-4Ch],esi&lt;br /&gt;System.Console.WriteLine(i);&lt;br /&gt;00000112  mov         ecx,dword ptr [ebp-4Ch]&lt;br /&gt;00000115  call        747E2EA0&lt;br /&gt;0000011a  nop&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This will actually give you an output of 4. We declare &lt;code&gt;i&lt;/code&gt; and store it in &lt;code&gt;ebp&lt;/code&gt;. When we reach our &lt;code&gt;i = (i++) + (++i);&lt;/code&gt; statement, we store the value of &lt;code&gt;i&lt;/code&gt; in register &lt;code&gt;esi&lt;/code&gt;. So far, so good. The next two instructions increment the value of &lt;code&gt;i&lt;/code&gt; - at this point, I would expect the output of the statement to be 5 or 6, right? Instead, C# does something odd here, and adds it to the original value of &lt;code&gt;i&lt;/code&gt; stored in &lt;code&gt;esi&lt;/code&gt;. Not at all what I would expect - except, again, that pre- and post-increment operators do not have the same &lt;a href="http://msdn.microsoft.com/en-us/library/6a71f45d.aspx"&gt;order of precedence&lt;/a&gt;. In this case, it appears as if what we are really calculating is &lt;code&gt;i = i + (++(i++))&lt;/code&gt;, or &lt;code&gt;i = i + ((i+1))+1)&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Moral of the Story&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Undefined operations can have interesting results. I haven't searched the C# specification for whether or not this really is undefined in C# (I imagine I probably should do that!) - but either way, people should be careful using what is undefined in one language in a different language as well.&lt;/li&gt;&lt;li&gt;There really is a difference between pre- and post-increment, and order of precedence matters a lot (unless, of course, 3 == 4 == 5).&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8132362186755867250-1030092378185579408?l=dynamicreconfiguration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicreconfiguration.blogspot.com/feeds/1030092378185579408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2009/01/order-of-operations-mystery.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/1030092378185579408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/1030092378185579408'/><link rel='alternate' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2009/01/order-of-operations-mystery.html' title='Order of Operations and the Undefined Behavior'/><author><name>Matt</name><uri>http://www.blogger.com/profile/01164105987665817878</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8132362186755867250.post-4536787954859378472</id><published>2009-01-02T08:30:00.000-08:00</published><updated>2010-07-13T12:00:01.517-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>And so it begins...</title><content type='html'>I won't claim that this is the first blog / weblog / online posting I've ever created.  As with all my previous attempts at writing something interesting in a web environment, I don't have very high hopes that it will last much longer than a few months. &lt;br /&gt;&lt;br /&gt;As an aside, I hate having to come up with titles.  I'm not very good at it; I think I try to get too creative and end up with something that, quite frankly, sounds a bit smarmy.  I probably did the same thing here - "Dynamic Reconfiguration" - my only excuse is that it was available.  Loosely, Dynamic Reconfiguration refers to an area of research (with some implementations here and there) where hardware is able to adapt itself at run-time to the problems its required to solve.  Dynamic Reconfiguration was a driving interest in my research for my master's; but, as is true with most people who pursue graduate degrees, its role in my life is now relegated to an interesting sidenote on my CV.  Oh well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8132362186755867250-4536787954859378472?l=dynamicreconfiguration.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicreconfiguration.blogspot.com/feeds/4536787954859378472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2009/01/and-so-it-begins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/4536787954859378472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8132362186755867250/posts/default/4536787954859378472'/><link rel='alternate' type='text/html' href='http://dynamicreconfiguration.blogspot.com/2009/01/and-so-it-begins.html' title='And so it begins...'/><author><name>Matt</name><uri>http://www.blogger.com/profile/01164105987665817878</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
