How to data bind Menu object using HierarchicalDataTemplate at runtime?
-
Wednesday, February 27, 2008 11:17 PM
How to data bind Menu object using HierarchicalDataTemplate defined in Window1.xaml and the code below.
Window1.xaml
...
<Window.Resources>
<HierarchicalDataTemplate DataType="MenuItem" ItemsSource="{Binding XPath=*}">
<MenuItem Header="{Binding XPath=@Name}"/>
</HierarchicalDataTemplate>
</Window.Resources>
...
Window1()
{
Binding bind = new Binding();
this._mainMenu = new Menu();
this._mainMenu.Name = "MainMenu";
this._mainMenu.Height = 22;
bind.Source = new MenuDataProvider(System.Configuration.ConfigurationManager.AppSettings["MainMenu"]);//Derived from XmlDataProvider
bind.XPath = "Menu/MenuItem/*";
this._mainMenu.SetBinding(Menu.ItemsSourceProperty, bind);
}Below are couple quesitons(keep in mind. I'm new at this template stuff).
1. How do I programmatically attach the template above to the Menu object? (Or, is it done automatically?)
2. What am I doing wrong? (With the above code, xaml and the menu.xml, I see everything displayed on a long menubar. I'm thinking it has something to do with my template but I'm at a lost as to where or what it is). Help please.Please see menu.xml below;
THX
JB-------------------------
<?xml version="1.0" encoding="utf-8" ?>
<Menu xmlns="">
<MenuItem Name="File" Header="_File">
<MenuItem Name="FileExit" Header="_Exit" Click="OnFileExit"/>
</MenuItem>
<MenuItem Name="Edit" Header="_Edit">
<MenuItem Name="EditCut" Header="_Cut" InputGestureText="Ctrl+X" Command="ApplicationCommands.Cut"/>
<Separator/>
<MenuItem Name="EditCopy" Header="_Copy" InputGestureText="Ctrl+C" Command="ApplicationCommands.Copy"/>
<Separator/>
<MenuItem Name="EditPaste" Header="_Paste" InputGestureText="Ctrl+V" Command="ApplicationCommands.Paste"/>
</MenuItem>
<MenuItem Name="View" Header="_View">
<MenuItem Name="ViewTopMost" IsCheckable="True" StaysOpenOnClick="False" Header="_Top Most" Click="OnClickTopMost"/>
</MenuItem>
<MenuItem Name="Tools" Header="_Tools">
<MenuItem Name="ToolsLanguage" Header="_Language">
<MenuItem Name="ToolsLanguageOperator" Header="_Operator Text" Margin="0,0,0,0" VerticalAlignment="Stretch" BorderThickness="0,0,0,0"/>
<Separator/>
<MenuItem Name="ToolsLanguageCaller" Header="_Caller Text"/>
</MenuItem>
<Separator/>
<MenuItem Name="ToolsOptions" Header="_Options..." Command="ApplicationCommands.Properties"/>
</MenuItem>
<MenuItem Header="_Window" Name="Window"/>
<MenuItem Name="Help" Header="_Help">
<MenuItem Name="HelpUserGuide" Header="_User Guide"/>
<Separator/>
<MenuItem Name="HelpAbout" Header="_About"/>
</MenuItem>
</Menu>
All Replies
-
Friday, February 29, 2008 3:09 AMModerator
For your questions, the following example shows how to bind the data source to a Menu control in XAML and in code behind. Your menu.xml is a xml file, but not a XAML file, so we are unable to use this as the data source for data binding directly. If you want to use the xml file as the data source, you can parse the xml file to a custom object, and use the object for data binding.
Code Snippet<Window
x:Class="ForumProjects.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Width="800" Height="600">
<Window.Resources>
<XmlDataProvider x:Key="Menus" XPath="menus/menu">
<x:XData>
<menus xmlns="">
<menu name="_File">
<menu name="New">
<menu name="_Project..."/>
<menu name="_Web Site..."/>
</menu>
<menu name="C_lose"/>
<menu name="E_xit"/>
</menu>
<menu name="_Edit">
<menu name="Cu_t"/>
<menu name="_Copy"/>
<menu name="_Paste"/>
</menu>
</menus>
</x:XData>
</XmlDataProvider>
<HierarchicalDataTemplate x:Key="MenuTemplate" ItemsSource="{Binding XPath=menu}">
<AccessText Text="{Binding XPath=@name}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<StackPanel>
<!-- Binding in XAML -->
<Menu ItemsSource="{Binding Source={StaticResource Menus}}"
ItemTemplate="{StaticResource MenuTemplate}"/>
<!-- Binding in code behind -->
<Menu x:Name="ManualMenu"/>
</StackPanel>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// data binding code
Binding dataSource = new Binding() { Source = this.FindResource("Menus") };
this.ManualMenu.SetBinding(Menu.ItemsSourceProperty, dataSource);
this.ManualMenu.ItemTemplate = (DataTemplate)this.FindResource("MenuTemplate");
}
}
Furthermore, you can refer to the following link to get more information about data binding.
http://msdn2.microsoft.com/en-us/library/ms750612.aspx
Best Regards,
Wei Zhou
-
Wednesday, March 05, 2008 12:59 AM
Cool
How do I bind commands to each of these menuitem with the MENU.XML above?
Thx

