views:

189

answers:

2

Hi,

I have a LOT of MenuItem(s), and I want to be able to change their "Content" so that it displays in the program. When I load up the program, their "Content Name" is set in a Setter I created.. but the only problem is that I have almost a hundred MenuItem objects, and I need their display names in the program to be different (not the setter's default). I could just create over 100 different "Setter"'s and change one line in them.. but that is very time consuming. Is there a simpler approach? I want to be able to do this in the XAML where I am declaring them. Is there a way to do this? I've been searching and trying different attempts, but nothing so far.. perhaps someone knows?

EDIT:

Sorry, Perhaps I am being a bit unclear..

I already have created the MenuItems and they are based on the Setter that I have created... The problem is.. I now want each one to still be based on that Setter, but to have a unique "Content"/Name that displays for the user...Currently, they all have the "Content" name given to them by the setter, but I am looking for a way to set each MenuItem's content name through XAML.. is this possible?

Thanks

A: 

You question is not clear. i think the best way to create hundreds of menu items is to create them from the code not in XAML. for example in a foreach loop. then you can give each of them a unique and meaningfull name. please describe your problem more clearly.

thanks

Nima Rikhtegar
Sorry, Perhaps I am being a bit unclear..I already have created the MenuItems and they are based on the Setter that I have created... The problem is.. I now want each one to still be based on that Setter, but to have a unique "Content"/Name that displays for the user...Currently, they all have the "Content" name given to them by the setter, but I am looking for a way to set each MenuItem's content name through XAML.. is this possible?
Kyle
A: 

Now I understand your problem. generaly i think it would be a very bad idea to set the content property for each of your menuItems in the XAML file. Specialy when you are dealing with hundreds of items. a better way is to use the Data binding feature of WPF and DataTemplates, not to hardcode the menuItem names in the XAML file. I will propuse two solutions for your problem. first solution uses the code-behind approach to create menu items and then bind them to MainMenu's ItemsSource property without using dataTemplates. the following code is the code-behind code for the window:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MenuItems = new ObservableCollection<MenuItem>();

        for (int i = 0; i < 40; i++)
        {
            MenuItem menuItem = new MenuItem();
            menuItem.Header = "MenuItem" + i.ToString();
            MenuItems.Add(menuItem);
        }

        MainMenu.DataContext = this;
    }

    public ObservableCollection<MenuItem> MenuItems
    {
        get;
        set;
    }
}

in this code first we created 40 number of menuItems and then we bind them to the DataContext property of the MainMenu object. the following code shows the XAML code of the windows including it's MainMenu object:

<Window x:Class="WpfApplication17.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0" Name="MainMenu" ItemsSource="{Binding MenuItems}">

        </Menu>
    </Grid>
</Window> 

in this approch you can first create all of your menu items and their names in the code and after that bind them to the Menu object. then you can use styles to set common properties of the menu items.

but a better solution is to use dataTemplates as I did in the following code. in this approach first you created a class to store your menu item names. then with the help of the data template feature of WPF you can bind them to your MainMenu items. the code-behind of this solution is as follows:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MenuItems = new ObservableCollection<CustomMenuItem>();

        MenuItems.Add(new CustomMenuItem("Item 1"));
        MenuItems.Add(new CustomMenuItem("Item 2"));
        MenuItems.Add(new CustomMenuItem("Item 3"));

        MainMenu.DataContext = this;
    }

    public ObservableCollection<CustomMenuItem> MenuItems
    {
        get;
        set;
    }
}

public class CustomMenuItem
{
    public string Name { get; set; }

    public CustomMenuItem(string name)
    {
        Name = name;
    }
}

in this code I used the CustomMenuItem class to store menuitem names. the MainWindows constructor is respossible for creating the menuitems but you can retrieve them from other sources, like a XML file of database. the XAML code for the MainWindow is like this:

<Window x:Class="WpfApplication17.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication17"
        Title="MainWindow" Height="350" Width="525" >
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:CustomMenuItem}">
            <TextBlock Text="{Binding Name}"></TextBlock>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Menu Grid.Row="0" Name="MainMenu" ItemsSource="{Binding MenuItems}">

        </Menu>
    </Grid>
</Window>

this way you can retrieve your menuitem names fot\r example from a XML file or from other data sources and they are not hardcoded into you XAML file. then you can use the powerfull features of DataTemplates to view you menu items the way you like.

Nima Rikhtegar